Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个上下文类,两个模型类_C#_Asp.net Mvc_Ef Code First - Fatal编程技术网

C# 一个上下文类,两个模型类

C# 一个上下文类,两个模型类,c#,asp.net-mvc,ef-code-first,C#,Asp.net Mvc,Ef Code First,我正在学习MVC,我了解如何创建单个模型类,然后创建单个上下文类,然后基于模型/上下文组合创建控制器和视图,并首先使用代码将模型提交到数据库 现在我想把第二个模型(因此表)加入到混合中。我最初尝试创建第二个上下文类,然后创建第二个模型类,然后以相同的方式创建控制器和视图。因此,我发现一次只能向数据库提交一个模型。每当我在一个模型上启用自动迁移,然后在软件包管理器中运行更新数据库命令时,另一个表就会从我的数据库中消失,而另一个模型的添加/删除/编辑/查看功能也会断开 当然,您必须能够使用此技术管理

我正在学习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>