背景:
我在同一个解决方案中有一个Web API项目和一个类库项目,它们共享相同的Model类。两个项目共享同一个数据库,并且都使用DbContext来读/写数据。
Web API项目以典型的UnitOfWork模式设置,并且运行正常。
班级项目有点不同。我在构造函数中指定连接字符串而不是Web.config文件:
class MyContext : DbContext
{
public MyContext(string connectionString)
: base()
{
// Do this to force me to use eager loading
this.Configuration.LazyLoadingEnabled = false;
// Init connection string
this.Database.Connection.ConnectionString = connectionString;
Database.SetInitializer <CFCalcContext> (null);
}
... DbSets ...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
... modelBuilder details ...
}
}
我使用Web API调用类库中定义的函数。当我尝试使用类库查询数据库时,我收到错误。
问题:
在类库项目中,我得到一个EntityCommandCompilationException,内部异常为:
InnerException:System.Data.MappingException 的HResult = -2146232032 消息=(82,10):错误3034:从第82,90行开始映射片段的问题:映射具有不同键的两个实体 到同一排。确保这两个映射片段不映射两个 具有不同键的实体组到同一组行。
(82,10):错误3034:从行开始映射片段时出现问题 82,98:具有不同键的两个实体被映射到同一行。 确保这两个映射片段不映射两组实体 使用同一组行的不同键。
(82,10):错误3034:从行开始映射片段时出现问题 82,106:具有不同主键的两行映射到同一个 实体。确保这两个映射片段不映射两组 具有相同键的实体到两个重叠的行组。
(82,10):错误3034:从行开始映射片段时出现问题 82,112:具有不同键的两个实体被映射到同一行。 确保这两个映射片段不映射两组实体 使用不同的键到两个重叠的行组。
(82,10):错误3034:从行开始映射片段时出现问题 82,118:具有不同键的两个实体被映射到同一行。 确保这两个映射片段不映射两组实体 使用不同的键到两个重叠的行组。
(90,10):错误3034:从行开始映射片段时出现问题 90,98:具有不同键的两个实体被映射到同一行。 确保这两个映射片段不映射两组实体 使用同一组行的不同键。
此外,当我右键单击派生的DbContext类(在类库中)并使用Entity Framework Power Tools“查看实体数据模型”时,我收到错误:“在DbContext中找不到可构造类型选定的文件。“这在Web API项目中运行得很好。
为什么连接到同一个数据库并且配置基本相同的两个DbContexts执行不同的操作?我必须错过配置步骤,但我不知道哪个。
感谢您的帮助!
答案 0 :(得分:0)
这里有很多事情要做。首先,如果你手动设置连接字符串,你应该在对基础构造函数的调用中设置它:
public MyContext(string connectionString)
: base(connectionString)
其次,你应该把它放在Web.Config中 - 如果名称是问题,你可以给它一个不同的名字,如:
public MyContext()
: base("Whatever name I used in Web.Config")
第三,这可能是错的:
Database.SetInitializer <CFCalcContext> (null);
documentation for Database.SetInitializer州:
获取或设置数据库初始化策略。从DbCompiledModel初始化DbContext实例时,将调用数据库初始化策略。
换句话说,将它设置为null可能会让你的DbContext一旦尝试做任何事情就会爆炸 - 我怀疑这就是你在这里发生的事情。