2011-02-23 126 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