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
实体。但这仍然会导致映射问题。我想我可以通过从存储映射中删除未使用的列来解决这个问题,但是每次从数据库更新模型时,我都必须这样做。