3

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

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 迁移来更新数据库 ( 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");
    }
4

2 回答 2

3

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

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

像这样创建一个数据库上下文:

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

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

于 2013-04-11T18:38:24.643 回答
0

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

到目前为止,包括 EF 5 - 不支持多个迁移表。

理论上,您可以通过调整迁移脚本来管理两个迁移 - 并创建一个包含这两个集合的数据库,所以这不是问题。

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

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

有关更多信息和详细信息,请参阅我的这篇文章......
迁移没有按我的意愿工作...... Asp.net EntityFramework

关闭迁移:

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

(关闭迁移的)“侵入性”较小的方法是执行以下操作...

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

(从这里

于 2013-04-11T18:43:42.083 回答