带有多个模型的实体框架抛出错误,提示“支持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");
}
错误信息具有欺骗性-这不能/不应该通过"代码优先迁移"来解决。您有两个不同的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);
(离这里)