Entity framework 从同一个表创建实体类型和关联
一个实体类型和多个关联是否可以由同一个表支持?我尝试了两种不同的方法,但都因不同的错误而失败 首先,我尝试从数据库创建模型,然后在设计器中创建关联 它为我提供了适当的Entity framework 从同一个表创建实体类型和关联,entity-framework,entity-framework-6,ef-database-first,Entity Framework,Entity Framework 6,Ef Database First,一个实体类型和多个关联是否可以由同一个表支持?我尝试了两种不同的方法,但都因不同的错误而失败 首先,我尝试从数据库创建模型,然后在设计器中创建关联 它为我提供了适当的Foos和bar导航属性,但它没有任何表支持,并且在我尝试执行查询时失败 Model1.msl(3,4) : error 3027: No mapping specified for the following EntitySet/AssociationSet - BarFoo. 因此,我尝试将关联映射到设计器中的FooBar表。
Foos
和bar
导航属性,但它没有任何表支持,并且在我尝试执行查询时失败
Model1.msl(3,4) : error 3027: No mapping specified for the following EntitySet/AssociationSet - BarFoo.
因此,我尝试将关联映射到设计器中的FooBar表。只有FooREF
和BarREF
是关联的一部分,但是EF希望主键也被映射
ERROR (3025): Problem in Mapping Fragment starting at line 32: Must specify mapping for all key properties (FooBar.ObjectID) of table FooBar.
由于无法映射ObjectID和RowVersion,因此我尝试在edmx中使用a来排除它们
<edmx:Mappings>
<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
<EntityContainerMapping StorageEntityContainer="TestModelStoreContainer" CdmEntityContainer="TestEntities">
<EntitySetMapping Name="Bars">
<EntityTypeMapping TypeName="TestModel.Bar">
<MappingFragment StoreEntitySet="Bar">
<ScalarProperty Name="ObjectID" ColumnName="ObjectID" />
<ScalarProperty Name="Count" ColumnName="Count" />
<ScalarProperty Name="RowVersion" ColumnName="RowVersion" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="Foos">
<EntityTypeMapping TypeName="TestModel.Foo">
<MappingFragment StoreEntitySet="Foo">
<ScalarProperty Name="ObjectID" ColumnName="ObjectID" />
<ScalarProperty Name="Name" ColumnName="Name" />
<ScalarProperty Name="RowVersion" ColumnName="RowVersion" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="FooBars">
<EntityTypeMapping TypeName="TestModel.FooBar">
<MappingFragment StoreEntitySet="FooBar">
<ScalarProperty Name="ObjectID" ColumnName="ObjectID" />
<ScalarProperty Name="RowVersion" ColumnName="RowVersion" />
<ScalarProperty Name="BarREF" ColumnName="BarREF" />
<ScalarProperty Name="FooREF" ColumnName="FooREF" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<AssociationSetMapping Name="BarFoo" TypeName="TestModel.BarFoo" >
<EndProperty Name="Foo">
<ScalarProperty Name="ObjectID" ColumnName="FooREF" />
</EndProperty>
<EndProperty Name="Bar">
<ScalarProperty Name="ObjectID" ColumnName="BarREF" />
</EndProperty>
<QueryView>
SELECT VALUE TestModel.BarFoo(CREATEREF(TestEntities.Foos, row(f.FooREF), TestModel.Foo), CREATEREF(TestEntities.Bars, row(f.BarREF), TestModel.Bar))
FROM TestModelStoreContainer.FooBar AS f
</QueryView>
</AssociationSetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
选择值TestModel.BarFoo(CREATEREF(TestEntities.Foos,row(f.FooREF),TestModel.Foo),CREATEREF(TestEntities.Bar,row(f.BarREF),TestModel.Bar))
从TestModelStoreContainer.FooBar作为f
但是,尽管记录了QueryView元素,但它的添加会导致模式验证失败
MappingException: Schema specified is not valid. Errors:
<File Unknown>(39,8) : error 2025: XML Schema validation failed for mapping schema. Schema Error Information : The element 'AssociationSetMapping' in namespace 'http://schemas.microsoft.com/ado/2009/11/mapping/cs' has invalid child element 'QueryView' in namespace 'http://schemas.microsoft.com/ado/2009/11/mapping/cs'. List of possible elements expected: 'Condition, ModificationFunctionMapping' in namespace 'http://schemas.microsoft.com/ado/2009/11/mapping/cs'..
MappingException:指定的架构无效。错误:
(39,8):错误2025:映射架构的XML架构验证失败。架构错误信息:命名空间中的元素“AssociationSetMapping”http://schemas.microsoft.com/ado/2009/11/mapping/cs'在命名空间中具有无效的子元素'QueryView'http://schemas.microsoft.com/ado/2009/11/mapping/cs'. 需要的可能元素列表:命名空间中的“条件,ModificationFunctionMapping”http://schemas.microsoft.com/ado/2009/11/mapping/cs'..
这里有我遗漏的策略吗?最后,我希望能够将
FooBar
视为一个实体,同时保留Foos
和bar
导航属性。这可能吗?不确定您的意思,但EF希望主键也被映射。首先用代码映射显式连接表非常容易,但我想在edmx设计器中映射它也不会有问题。@IvanStoev我就是这样理解这个错误的。FooBar表的主键是ObjectID
,但它不包括在关联映射中。很抱歉,我刚才看到您正在尝试同时使用Foos
、bar
和FooBars
导航属性。我认为这在EF中是不可能的,你可以只使用Foos
和bar
带隐式链接表,或者只使用FooBars
和显式FooBar
实体。我可能只使用Foos
和bar
导航属性,并摆脱FooBar
实体。但这仍然会导致映射问题。我想我可以通过从存储映射中删除未使用的列来解决这个问题,但是每次从数据库更新模型时,我都必须这样做。