1

我正在学习 MVC,我了解如何创建单个模型类,然后创建单个上下文类,然后基于模型/上下文组合创建控制器和视图,并使用代码将模型提交到数据库-第一的。

现在我想将第二个模型(以及表格)加入到组合中。我最初尝试以相同的方式创建第二个上下文类,然后是第二个模型类,然后是控制器和视图。结果,我发现我一次只能将一个模型提交到数据库。每当我在一个模型上启用自动迁移,然后Update-Database在包管理器中运行命令时,另一个表就会从我的数据库中消失,并且另一个模型的添加/删除/编辑/查看功能也会中断。

当然,您必须能够使用此技术来管理多个表吗?我的问题是,如果我有两个模型类,如下所示:

[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; }
}

如果我想同时使用两者,我的 Context 类需要是什么样的?我的想法是试试这个:

public class FooBar : DbContext
{
    public FooBar()
        : base("DefaultConnection")
    {

    }

    public DbSet<ModelOne> TableOne { get; set; }
    public DbSet<ModelTwo> TableTwo { get; set; }
}

然后在添加控制器向导中,我可以选择具有读/写操作和视图的 MVC 控制器,使用模板下拉列表中的实体框架、模型类下拉列表中的ModelOne数据上下文类下拉列表中的FooBar-第一个模型的下拉列表,以及第二个模型的模型类下拉列表中的ModelTwo相同的选项,一切都会按预期工作,但是每当我尝试基于模型创建第一个控制器时,我都会得到这个错误:

生成 FooBar 时出错。尝试重建您的项目。

我已经尝试重建我的项目,但我得到了同样的错误,所以很明显我做错了更大的事情。我做错了什么,我需要如何修改我的 FooBar 上下文类以使事情正常工作,假设它是我的 FooBar 上下文类是错误的?

4

1 回答 1

2

通常,上下文类和模型类之间不会存在一对一的关系。所有关联的模型都进入一个上下文。例如,我的应用程序中的每个区域通常都有一个上下文,但如果您不使用区域,您仍然可以在单个上下文中对模型进行逻辑分组。

问题出现的地方在于有多个上下文。EF 只喜欢迁移一个上下文。如果没有迁移,您可以很容易地通过在上下文类上手动指定所有上下文类来使用相同的数据库。

public class MyContext: DbContext
{
    public MyContext()
        : base("name=MyConnectionName")
    {
    }
}

如果每个上下文都是这样定义的,那么它们都将使用命名连接字符串指向的同一个数据库。

至于让迁移一起玩,编程实体框架:DbContext(以及几乎所有相关的 EF 书籍)的作者 Julie Lerman 有一个利用通用基类的解决方案(编辑:实际上 Julie 将该模式归因于EF 团队的 Arthur Vickers):

public class BaseContext<TContext> : DbContext
where TContext : DbContext
{
    static BaseContext()
    {
        Database.SetInitializer<TContext>(null);
    }
    protected BaseContext()
        : base("name=breakaway")
    {
    }
}

并且,然后您让每个单独的上下文继承自BaseContext

public class TripPlanningContext : BaseContext<TripPlanningContext>
public class SalesContext : BaseContext<SalesContext>

相关部分从上述书籍的第 231 页开始。

更新

其实我骗了你。Julie 给出的模式只是为了让它们更容易共享同一个数据库。要通过仅针对一个上下文问题的迁移,您必须作弊并实质上创建一个包含所有内容的大上下文,然后仅将其用于数据库初始化/迁移。对于代码中的其他所有内容,您将使用其他更具体的上下文。

于 2012-11-13T22:34:12.297 回答