C# 一个上下文类,两个模型类
我正在学习MVC,我了解如何创建单个模型类,然后创建单个上下文类,然后基于模型/上下文组合创建控制器和视图,并首先使用代码将模型提交到数据库 现在我想把第二个模型(因此表)加入到混合中。我最初尝试创建第二个上下文类,然后创建第二个模型类,然后以相同的方式创建控制器和视图。因此,我发现一次只能向数据库提交一个模型。每当我在一个模型上启用自动迁移,然后在软件包管理器中运行C# 一个上下文类,两个模型类,c#,asp.net-mvc,ef-code-first,C#,Asp.net Mvc,Ef Code First,我正在学习MVC,我了解如何创建单个模型类,然后创建单个上下文类,然后基于模型/上下文组合创建控制器和视图,并首先使用代码将模型提交到数据库 现在我想把第二个模型(因此表)加入到混合中。我最初尝试创建第二个上下文类,然后创建第二个模型类,然后以相同的方式创建控制器和视图。因此,我发现一次只能向数据库提交一个模型。每当我在一个模型上启用自动迁移,然后在软件包管理器中运行更新数据库命令时,另一个表就会从我的数据库中消失,而另一个模型的添加/删除/编辑/查看功能也会断开 当然,您必须能够使用此技术管理
更新数据库
命令时,另一个表就会从我的数据库中消失,而另一个模型的添加/删除/编辑/查看功能也会断开
当然,您必须能够使用此技术管理多个表?我的问题是,如果我有两个模型类,如下所示:
[Table("TableOne")]
public class ModelOne
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Foo { get; set; }
}
[Table("TableTwo")]
public class ModelTwo
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Bar { get; set; }
}
如果我想同时使用两者,我的上下文类需要什么样的外观?我的想法是尝试一下:
public class FooBar : DbContext
{
public FooBar()
: base("DefaultConnection")
{
}
public DbSet<ModelOne> TableOne { get; set; }
public DbSet<ModelTwo> TableTwo { get; set; }
}
公共类FooBar:DbContext
{
公共食品
:base(“默认连接”)
{
}
公共DbSet TableOne{get;set;}
公共DbSet TableTwo{get;set;}
}
然后在添加控制器向导中,我可以从模板下拉列表中使用实体框架,从模型类下拉列表中使用ModelOne选择具有读/写操作和视图的MVC控制器,第一个模型的数据上下文类的下拉列表中的FooBar,第二个模型的模型类的ModelTwo下拉列表中的ModelTwo选项相同,一切都会按预期工作,但每当我尝试基于模型一创建第一个控制器时,我得到这个错误:
生成FooBar时出错。尝试重建您的项目
我尝试过重建我的项目,但我也犯了同样的错误,所以很明显我犯了更大的错误。假设是我的FooBar上下文类出错了,那么我做错了什么?我需要如何修改我的FooBar上下文类以使其正常工作?一般来说,上下文类和模型类之间不存在1对1的关系。所有关联模型都进入一个上下文。例如,在我的应用程序中,通常每个区域都有一个上下文,但如果你不使用区域,你仍然可以在单个上下文中对模型进行逻辑分组 问题出在多个上下文中。EF只喜欢迁移一个上下文。如果不进行迁移,通过在上下文类上手动指定,您可以很容易地让所有上下文类使用相同的数据库
public class MyContext: DbContext
{
public MyContext()
: base("name=MyConnectionName")
{
}
}
如果每个上下文都是这样定义的,那么它们都将使用命名连接字符串指向的同一个DB
至于让迁移顺利进行,《编程实体框架:DbContext》(以及几乎所有相关的EF书籍)的作者Julie Lerman有一个利用通用基类的解决方案(编辑:实际上Julie将该模式归因于EF团队的Arthur Vickers):
相关章节从上述书的第231页开始
更新
事实上我骗了你。Julie给出的模式只是为了让它们更容易共享同一个DB。为了只解决一个上下文问题而通过迁移,您必须作弊,并创建一个包含所有内容的大上下文,然后仅用于数据库初始化/迁移。对于代码中的其他内容,可以使用其他更具体的上下文
public class BaseContext<TContext> : DbContext
where TContext : DbContext
{
static BaseContext()
{
Database.SetInitializer<TContext>(null);
}
protected BaseContext()
: base("name=breakaway")
{
}
}
public class TripPlanningContext : BaseContext<TripPlanningContext>
public class SalesContext : BaseContext<SalesContext>