2011-02-23 125 views
1

我正在使用EF4將DB模式映射到對象模型;我最初從數據庫中生成EDMX,但是直接編輯XML(試圖在改變CSDL/MSL以使其近似於我想要的對象模型時保持SSDL相同)。該數據庫包含,在許多其他事情,通過外鍵(0 ..)1對多的約束,像這樣一對夫婦表:實體框架:0..1對多外鍵約束不被識別?

go 
create table Options (
    KitNodeID int primary key foreign key references KitNodes (KitNodeID), 
    [SKUID] int null foreign key (SKUID) references SKUs (SKUID) 
) 
go 
create table Upgrades (
    UpgradeID int identity (1, 1) primary key not null, 
    [Name] nvarchar(50) not null, 
    DefaultOptionID int null references Options (KitNodeID) 
) 

在EDMX的有關章節是這樣的:

[...]

<!-- SSDL content --> 
     <edmx:StorageModels> 
     <Schema Namespace="DModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl"> 
      <EntityContainer Name="DModelStoreContainer"> 

     <AssociationSet Name="FK__Upgrades__Defaul__70DDC3D8" Association="DModel.Store.FK__Upgrades__Defaul__70DDC3D8"> 
     <End Role="Options" EntitySet="Options" /> 
     <End Role="Upgrades" EntitySet="Upgrades" /> 
     </AssociationSet> 
</EntityContainer> 
    <EntityType Name="Upgrades"> 
     <Key> 
     <PropertyRef Name="UpgradeID" /> 
     </Key> 
     <Property Name="UpgradeID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> 
     <Property Name="Name" Type="nvarchar" Nullable="false" MaxLength="50" /> 
     <Property Name="DefaultOptionID" Type="int" /> 
    </EntityType> 
<Association Name="FK__Upgrades__Defaul__70DDC3D8"> 
      <End Role="Options" Type="DModel.Store.Options" Multiplicity="0..1" /> 
      <End Role="Upgrades" Type="DModel.Store.Upgrades" Multiplicity="*" /> 
      <ReferentialConstraint> 
      <Principal Role="Options"> 
       <PropertyRef Name="KitNodeID" /> 
      </Principal> 
      <Dependent Role="Upgrades"> 
       <PropertyRef Name="DefaultOptionID" /> 
      </Dependent> 
      </ReferentialConstraint> 
     </Association> 
</Schema></edmx:StorageModels> 

<!-- CSDL content --> 
    <edmx:ConceptualModels> 
     <Schema Namespace="DModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm"> 
     <EntityContainer Name="DEntities" annotation:LazyLoadingEnabled="true"> 
<EntitySet Name="Upgrades" EntityType="DModel.Upgrade" /> 
      <AssociationSet Name="Upgrade_DefaultOption" Association="DModel.Upgrade_DefaultOption"> 
      <End Role="Options" EntitySet="Options" /> 
      <End Role="Upgrades" EntitySet="Upgrades" /> 
      </AssociationSet> 
</EntityContainer> 
    <Association Name="Upgrade_DefaultOption"> 
      <End Role="Options" Type="DModel.Option" Multiplicity="0..1" /> 
      <End Role="Upgrades" Type="DModel.Upgrade" Multiplicity="*" /> 
     </Association> 
<EntityType Name="Upgrade"> 
      <Key> 
      <PropertyRef Name="UpgradeID" /> 
      </Key> 
      <Property Name="UpgradeID" Nullable="false" annotation:StoreGeneratedPattern="Identity" Type="Int32" /> 
      <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" /> 
      <NavigationProperty Name="DefaultOption" Relationship="DModel.Upgrade_DefaultOption" FromRole="Upgrades" ToRole="Options" /> 
      <NavigationProperty Name="OptInOptions" Relationship="DModel.OptInOptions" FromRole="Upgrades" ToRole="Options" /> 
     </EntityType> 
    </Schema> 
    </edmx:ConceptualModels> 

    <!-- C-S mapping content --> 
    <edmx:Mappings> 
     <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs"> 
     <EntityContainerMapping StorageEntityContainer="DModelStoreContainer" CdmEntityContainer="DEntities"> 
      <EntitySetMapping Name="Upgrades"><EntityTypeMapping TypeName="DModel.Upgrade"><MappingFragment StoreEntitySet="Upgrades"> 
      <ScalarProperty Name="UpgradeID" ColumnName="UpgradeID" /> 
      <ScalarProperty Name="Name" ColumnName="Name" /> 
      </MappingFragment></EntityTypeMapping></EntitySetMapping> 
<AssociationSetMapping Name="Upgrade_DefaultOption" TypeName="DModel.Upgrade_DefaultOption" StoreEntitySet="FK__Upgrades__Defaul__70DDC3D8"> 
      <EndProperty Name="Upgrades"> 
       <ScalarProperty Name="UpgradeID" ColumnName="UpgradeID"/> 
      </EndProperty> 
      <EndProperty Name="Options"> 
       <ScalarProperty Name="KitNodeID" ColumnName="DefaultOptionID"/> 
      </EndProperty> 
      </AssociationSetMapping> 
</EntityContainerMapping> 
     </Mapping> 
    </edmx:Mappings> 

它會生成代碼,但是當我嘗試使用它,我得到一個「錯誤2007:表‘FK_ 升級 _Defaul__70DDC3D8’指定爲該MSL的一部分不存在於MetadataWorkspace中。「看起來它無法找到SSDL應該使用的底層外鍵約束,但我確實在數據庫中看到一個具有該名稱的外鍵約束。

真的,我覺得我對這種映射應該如何工作一般沒有很好的理解 - 數據庫中的外鍵約束真的被視爲「關聯集」? - 但這是我能解決的最接近的問題。我不知道是否有人能夠根據我提供的信息診斷問題,但是有關哪裏的指示?我嘗試了各種方法,例如將StoreEntitySet更改爲指向選項等,但它們只是導致不同的錯誤。

+1

如果清理解決方案並更新edmx文件會發生什麼情況? – CarneyCode 2011-02-23 19:30:36

回答

1

試着改變你如何定義你的外鍵,請參見:How do I create a foreign key in SQL Server?

你可能會刪除並重新創建你的模型。

+0

由於各種原因,我們完全放棄了EF,但感謝您的答案。 – 2011-10-21 22:45:15