带有多个模型的实体框架抛出错误,提示“支持modeldbcontext的模型”.环境变了……

本文关键字:模型 modeldbcontext 支持 环境 提示 错误 实体 框架 出错 | 更新日期: 2023-09-27 18:08:36

我有两个独立的不相关的模型,我试图在同一数据库中使用。下面是它们各自的代码:

public class ImageDBContext : DbContext
{
    public ImageDBContext()
        : base("DefaultConnection")
    {
    }
    public DbSet<ImageModel> Images { get; set; }
}
[Table("Images")]
public class ImageModel
{
    [Key]
    public int ID { get; set; }
    public string Type { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string FileName { get; set; }
    [NotMapped]
    public HttpPostedFileBase Attachment { get; set; }
}

这是另一个模型

public class TestimonialDBContext : DbContext
{
    public TestimonialDBContext()
        : base("DefaultConnection")
    {
    }
    public DbSet<Testimonial> Testimonials { get; set; }
}
[Table("Testimonials")]
public class Testimonial
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

当我访问一个模型的视图时,它工作得很好。不管是哪个模型但当我转到另一个模型的视图时我得到这个错误:

支持'ImageDBContext'上下文的模型在数据库创建后发生了变化。考虑使用Code First Migrations来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

在我看来,两个模型都试图使用同一个表?表由初始化的第一个模型创建,但第二个模型试图使用现有的表,而不是创建自己的表。

如何让两个模型在数据库中使用自己的表?

下面是连接字符串:

 <add name="DefaultConnection" connectionString="Data Source=localhost'SQLEXPRESS;Initial Catalog=--------;User ID=-------;Password=---------" providerName="System.Data.SqlClient" />

更新:我已经将以下代码添加到模型中,但我仍然得到相同的错误。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ImageModel>().ToTable("ImagesTable");
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Testimonial>().ToTable("TestimonialsTable");
    }

带有多个模型的实体框架抛出错误,提示“支持modeldbcontext的模型”.环境变了……

错误信息具有欺骗性-这不能/不应该通过"代码优先迁移"来解决。您有两个不同的dbcontext。如果它是相同的数据库,那么只使用一个上下文,你添加了图像和感言。

你这样做的方式,你基本上说有两个不同的数据库,使用相同的连接字符串,每个数据库有一个表,要么Images,要么Testimonials。因此,当您访问Images页面时,将创建包含一个表Images的数据库。但是当您访问Testimonials时,它会识别DB结构不匹配一个Testimonials表的模型并警告您。

创建一个DB上下文,如下所示:

public class MyDBContext : DbContext
{
    public DbSet<ImageModel> Images { get; set; }
    public DbSet<Testimonial> Testimonials { get; set; }
}

并且当你需要访问DB时,在你的控制器中创建一个该类的新实例。如果您将连接字符串(在web.config中)命名为"MyDbContext",则可以跳过需要调用base("DefaultConnection")的空构造函数。

当模型被创建,迁移,然后更新到Db - EF/CF创建__MigrationHistory -它存储DbContext,实体的确切EDMX模型。

到目前为止,包括EF 5在内,还不支持多次迁移表。

理论上,您可以通过调整迁移脚本来同时运行两个迁移,并创建一个包含两个集的数据库,因此这不是问题。

但是当你做两个模型/DbContext-s - 迁移表时,Db表的布局和你的实体不匹配 -对于同一个数据库…

从EF 6开始-您将获得multi-tenant migrations的支持。即EF6将允许每个数据库有多个上下文。

有关更多信息和细节,请参阅我的这篇文章…
移民没有像我希望的那样起作用…Asp.net EntityFramework

关闭迁移:

解决这个问题的方法是删除迁移。您可以简单地删除__MigrationHistory表(它在system tables下),不要尝试进行迁移。

较少"侵入性"的方法(关闭迁移)是执行以下操作…

Database.SetInitializer<FirstContext>(null);
Database.SetInitializer<SecondContext>(null);  

(离这里)