Entity Framework - 无法创建引用相同 table 的多个 DbContext。 - 解决方法
Entity Framework - Cannot create multiple DbContexts that reference the same table. - Workaround
根据标题,场景是:一个 c-sharp 项目,有两个文件夹,每个文件夹包含两个 EDMX 上下文...
Myproj\NSOne\ModelOne.edmx, Myproj\NSTwo\ModelTwo.edmx;
通常这很有效,直到您在两个上下文中共享相同的 table。设计时没有问题,实体 类 在不同的命名空间下生成,只是在运行时才会出现以下错误:
Schema specified is not valid. Errors: The mapping of CLR type to EDM
type is ambiguous because multiple CLR types match the EDM type
'TB_MyTable'. Previously found CLR type 'Namespace.NSOne.TB_MyTable',
newly found CLR type 'Namespace.NSTwo.CIXModel.TB_MyTable'.
在搜索答案时,我遇到了一个 Github 问题,该问题几乎表明 "it is too hard / not trivial" 我们不会解决。
https://github.com/aspnet/EntityFramework6/issues/362
但是,解决方法是编辑 EDMX 文件,如 github 问题中所述。
<ConceptualModels>
<Schema Namespace="ConsoleApplication33"
Alias="Self"
annotation:UseStrongSpatialTypes="false"
xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation"
xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation"
xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityType Name="Person"
customannotation:ClrType="MyApp.Person, MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="Name" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" />
</EntityType>
<EntityContainer Name="Town" customannotation:UseClrTypes="true">
<EntitySet Name="People" EntityType="Self.Person" />
</EntityContainer>
</Schema>
</ConceptualModels>
我的问题/问题是,在我的项目中找不到上面带有 "ConceptualModels" 的 xml 片段?!
我从哪里开始看?在我的 edmx 文件中(通过 visual studio),我只能看到,例如,
- ModelOne.edmx
- ModelOne.Context.tt
- ModelOne.Designer.csharp
- ModelOne.edmx.图表
- ModelOne.tt
EntityFramework.dll、EntityFramework.SqlServer.dll 版本为:
File version: 6.2.61023.0
Product version: 6.2.0-61023
不是真正的答案,但微软似乎已经放弃了 EF 数据库优先 (EDMX),所以在提出这个问题两个月后,我的下一个选择是自己从我当前的项目中摆脱它。
在未来的项目中,我还将优先使用 EF 代码,因为 VS 仍然允许轻松生成强类型 类。
ConceptualModels
是 EDMX 文件中的部分。
您只需要使用 XML 文本编辑器打开它。
- 右击
- 打开方式
- XML 文本编辑器。
根据标题,场景是:一个 c-sharp 项目,有两个文件夹,每个文件夹包含两个 EDMX 上下文...
Myproj\NSOne\ModelOne.edmx, Myproj\NSTwo\ModelTwo.edmx;
通常这很有效,直到您在两个上下文中共享相同的 table。设计时没有问题,实体 类 在不同的命名空间下生成,只是在运行时才会出现以下错误:
Schema specified is not valid. Errors: The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'TB_MyTable'. Previously found CLR type 'Namespace.NSOne.TB_MyTable', newly found CLR type 'Namespace.NSTwo.CIXModel.TB_MyTable'.
在搜索答案时,我遇到了一个 Github 问题,该问题几乎表明 "it is too hard / not trivial" 我们不会解决。 https://github.com/aspnet/EntityFramework6/issues/362
但是,解决方法是编辑 EDMX 文件,如 github 问题中所述。
<ConceptualModels>
<Schema Namespace="ConsoleApplication33"
Alias="Self"
annotation:UseStrongSpatialTypes="false"
xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation"
xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation"
xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityType Name="Person"
customannotation:ClrType="MyApp.Person, MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="Name" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" />
</EntityType>
<EntityContainer Name="Town" customannotation:UseClrTypes="true">
<EntitySet Name="People" EntityType="Self.Person" />
</EntityContainer>
</Schema>
</ConceptualModels>
我的问题/问题是,在我的项目中找不到上面带有 "ConceptualModels" 的 xml 片段?!
我从哪里开始看?在我的 edmx 文件中(通过 visual studio),我只能看到,例如,
- ModelOne.edmx
- ModelOne.Context.tt
- ModelOne.Designer.csharp
- ModelOne.edmx.图表
- ModelOne.tt
EntityFramework.dll、EntityFramework.SqlServer.dll 版本为:
File version: 6.2.61023.0 Product version: 6.2.0-61023
不是真正的答案,但微软似乎已经放弃了 EF 数据库优先 (EDMX),所以在提出这个问题两个月后,我的下一个选择是自己从我当前的项目中摆脱它。
在未来的项目中,我还将优先使用 EF 代码,因为 VS 仍然允许轻松生成强类型 类。
ConceptualModels
是 EDMX 文件中的部分。
您只需要使用 XML 文本编辑器打开它。
- 右击
- 打开方式
- XML 文本编辑器。