C# 是否可以将数据库优先和代码优先模型与实体框架混合使用?

C# 是否可以将数据库优先和代码优先模型与实体框架混合使用?,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,我将要开始一个web应用程序,在这个应用程序中,我希望将实体框架与(大部分)代码优先模型一起使用 但是,除了我计划创建的特定于应用程序的模型外,我还必须使用外部用户数据库。是否可以先将我的一个模型指定为数据库,然后使用单独的数据库上下文?从技术上讲,这是可能的,但我不建议这样做。首先全面使用代码要好得多。是的,具有讽刺意味的是,您可以对现有数据库使用“代码优先” public MyExistingDatabaseContext : DbContext { public MyExistin

我将要开始一个web应用程序,在这个应用程序中,我希望将实体框架与(大部分)代码优先模型一起使用


但是,除了我计划创建的特定于应用程序的模型外,我还必须使用外部用户数据库。是否可以先将我的一个模型指定为数据库,然后使用单独的数据库上下文?

从技术上讲,这是可能的,但我不建议这样做。首先全面使用代码要好得多。是的,具有讽刺意味的是,您可以对现有数据库使用“代码优先”

public MyExistingDatabaseContext : DbContext
{
    public MyExistingDatabaseContext()
        : base("MyExistingDatabaseConnectionStringName")
    {
        Database.SetInitializer<MyExistingDatabaseContext>(null);
    }

    // DbSets here
}
只需创建与现有数据库中的表匹配的POCO。如果POCO的名称与表的名称不同(并非所有表名都是有效的或适当的类名),则可以使用
table
属性明确告知EF POCO使用的表:

[Table("SomeTable")]
public class MyAwesomeEntity
{
    ...
}
然后,您将需要一个专门用于此现有数据库和属于它的任何实体的单独上下文。您所要做的就是1)告诉它应该使用什么连接字符串,2)关闭数据库初始化,这样EF就不会尝试实际创建数据库

public MyExistingDatabaseContext : DbContext
{
    public MyExistingDatabaseContext()
        : base("MyExistingDatabaseConnectionStringName")
    {
        Database.SetInitializer<MyExistingDatabaseContext>(null);
    }

    // DbSets here
}
public MyExistingDatabaseContext:DbContext
{
公共MyExistingDatabaseContext()
:base(“MyExistingDatabaseConnectionStringName”)
{
Database.SetInitializer(null);
}
//这里是DbSets
}

就这样。每当您需要使用此现有数据库中的实体时,只需重新创建此上下文或以其他方式获取它,例如通过DI(依赖项注入)容器,然后进城。

如果您已经有可用的现有数据库,但希望先使用代码,则应使用“先从数据库编写代码”选项

1) 在Models文件夹中,右键单击Add,New item

2) 在“数据”选项卡中选择ADO.NET实体数据模型

3) 输入模型名称

4) 首先从数据库中选择代码

public MyExistingDatabaseContext : DbContext
{
    public MyExistingDatabaseContext()
        : base("MyExistingDatabaseConnectionStringName")
    {
        Database.SetInitializer<MyExistingDatabaseContext>(null);
    }

    // DbSets here
}
5) 选择连接字符串

6) 选择要包含在模型中的数据库对象


您不必从头开始为上下文和模型编写代码,因为它将为您生成类。

谢谢!这很有道理。另外,值得一提的是,如果您在Visual Studio中安装EF Power Tools扩展,它就能够从现有数据库生成真正的POCO(而不是edmx)@ChrisPratt您提到代码优先&数据库优先是“技术上可能的”,您能解释一下如何做到这一点吗@谢谢你,先生^_^