实体框架初始化最佳实践

时间:2017-02-10 12:00:11

标签: c# entity-framework

我希望确保实体框架永远不会覆盖或尝试创建我要连接的数据库。它是以前由ASP网站访问的已建立的数据库(可视化基本脚本风格)。我已经看到了你通过的约定" name ="像这样进入基础构造函数...

//example 1    
public class SchoolDBContext: DbContext 
{
    public SchoolDBContext() : base("name=SchoolDBConnectionString") 
    {
    }
}

但是我宁愿没有HARDCODED(如上所述),所以也许......

//example 2
public SchoolDBContext(string ConnectionString) : base("name=" + ConnectionString) {
}

但我也希望能够在字符串为空的情况下发现错误......

//example 3
public SchoolDBContext(string ConnectionString) :  {
    if (string.IsNullOrWhitespace(ConnectionString) throw Exception("empty connection string");
    base("name=" + ConnectionString);        
}

问题1:我不确定第三位代码是否与第二位代码完成相同的工作,是吗?由于第三个例子可以在使用" name ="

调用base之前调用无参数构造

问题2:构造函数中是否有可用于更强大地配置EntityFramework的选项?

我使用EF 6

3 个答案:

答案 0 :(得分:1)

如果您不希望EF覆盖och,每次需要添加createinitializer类时都会创建一个新数据库。

public class CreateInitializer : CreateDatabaseIfNotExists<SchoolDBContext>{}

答案 1 :(得分:1)

问题1:

我也不确定。我需要承认我在例子中从未见过类似的东西。您可以告诉我们/我您的文档来源或您是如何想出这个想法的吗?

问题2: 如果你不是一个独立构造函数,那你试试这个怎么样?

    public SchoolDBContext()
        : base(ConnectionString == null ? "name=SchoolDBConnectionString" : WhateverYouDoIfItsWrong)
    {
        // Your code here! Lucky you
    }

答案 2 :(得分:1)

查看DbMigrationsConfiguration

您可以创建一个新类SchoolDbContextConfiguration类,它继承自它并将AutomaticMigrationsEnabled设置为false。

    internal sealed class Configuration : DbMigrationsConfiguration<SchoolDBContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }
}

在您的SchoolDbContext中初始化如下:

public SchoolDBContext(string ConnectionString) : base("name=" + ConnectionString) {
var init = new MigrateDatabaseToLatestVersion<SchoolDBContext, SchoolDbContextConfiguration>(true);
        Database.SetInitializer(init);

}