繁体   English   中英

实体框架初始化最佳实践

[英]Entity Framework initialisation best practices

我希望确保实体框架永远不会覆盖或尝试创建我要连接的数据库。 它是以前由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

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

public class CreateInitializer : CreateDatabaseIfNotExists<SchoolDBContext>{}

问题1:

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


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

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

看看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);

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM