1

背景

我在同一个解决方案中有一个 Web API 项目和一个类库项目,它们共享相同的模型类。两个项目共享同一个数据库,并且都使用 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 Message= (82,10) : error 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 项目中工作得很好。

为什么连接到同一个数据库并且配置基本相同的两个 DbContext 会执行不同的操作?我一定错过了一个配置步骤,但我不知道是哪个。

谢谢您的帮助!

4

1 回答 1

0

这里发生了很多事情。首先,如果您手动设置连接字符串,您应该在调用基本构造函数时设置它:

public MyContext(string connectionString)
    : base(connectionString)

其次,你真的应该把它放在 Web.Config 中 - 如果名称是问题,你可以给它一个不同的名称,例如:

public MyContext()
    : base("Whatever name I used in Web.Config")

第三,这可能是错误的:

Database.SetInitializer <CFCalcContext> (null);

Database.SetInitializer的文档指出:

获取或设置数据库初始化策略。当从 DbCompiledModel 初始化 DbContext 实例时,将调用数据库初始化策略。

换句话说,将其设置为 null 可能会使您的 DbContext 在它尝试做任何事情时立即爆炸——我怀疑这就是您在这里发生的事情。

于 2013-04-05T17:21:23.000 回答