类项目中DbContext的问题

时间:2013-04-05 16:47:44

标签: asp.net-mvc entity-framework asp.net-web-api dbcontext

背景

我在同一个解决方案中有一个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执行不同的操作?我必须错过配置步骤,但我不知道哪个。

感谢您的帮助!

1 个答案:

答案 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一旦尝试做任何事情就会爆炸 - 我怀疑这就是你在这里发生的事情。