C# 实体框架5代码优先配置封装

C# 实体框架5代码优先配置封装,c#,ef-code-first,entity-framework-5,C#,Ef Code First,Entity Framework 5,我想知道(我讨厌使用“最佳实践”这个词),但这是一个很好的方法来处理配置,因为它封装了AAA的配置 我看到很多例子,其中的OnModelCreating是一个庞大的创建数据库的指令列表,长方法告诉我有些地方不是很安静 public class MyContext : DbContext { public MyContext() : base("name=MyDb") { } public DbSet<AAA> AAAs { get; set; } prot

我想知道(我讨厌使用“最佳实践”这个词),但这是一个很好的方法来处理配置,因为它封装了AAA的配置

我看到很多例子,其中的
OnModelCreating
是一个庞大的创建数据库的指令列表,长方法告诉我有些地方不是很安静

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

    public DbSet<AAA> AAAs { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Configurations.Add(new AAA.Configuration());
    }
}
公共类MyContext:DbContext
{
public MyContext():base(“name=MyDb”){}
公共数据库集AAAs{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Configurations.Add(新的AAA.Configuration());
}
}
还有这个类,它的配置有一个点

public class AAA
{
    [Key] 
    public int Id { get; set; }

    [Required] 
    public string Details { get; set; }

    internal class Configuration : EntityTypeConfiguration<AAA>
    {
        public Configuration()
        {
            // Set all the funky stuff here
        }
    }
}
公共级AAA
{
[关键]
公共int Id{get;set;}
[必需]
公共字符串详细信息{get;set;}
内部类配置:EntityTypeConfiguration
{
公共配置()
{
//把所有时髦的东西都放在这里
}
}
}
我知道可能没有一条正确的道路。在我投入大量时间和眼泪之前,我正在寻找一个原因,为什么这可能是世界上最糟糕的想法,或者是否有一种方法可以做类似的事情

编辑

一位同事建议将此作为使用静态属性的替代方法

public class AAA
{
    [Key] 
    public int Id { get; set; }

    [Required] 
    public string Details { get; set; }

    public static EntityTypeConfiguration<AAA> Configuration
    {
        get { return new AAAConfiguration(); }
    }

}

internal class AAAConfiguration : EntityTypeConfiguration<AAA>
{
   public AAAConfiguration()
   {
            // Set all the funky stuff here
   }
}
公共级AAA
{
[关键]
公共int Id{get;set;}
[必需]
公共字符串详细信息{get;set;}
公共静态EntityTypeConfiguration配置
{
获取{返回新的aaa配置();}
}
}
内部类AAA配置:EntityTypeConfiguration
{
公共AAA配置()
{
//把所有时髦的东西都放在这里
}
}

我喜欢这一点,因为它使我在如何实例化配置方面有了更多的灵活性

视情况而定。到目前为止,我可以说我不关心db生成。它很好,有我不关心的优点(独立于平台)。它限制了完全使用SQL Server,因此它又回到了数据库项目


这是一个妥协的世界,很抱歉,最佳实践有很多限制。

这取决于具体情况。到目前为止,我可以说我不关心db生成。它很好,有我不关心的优点(独立于平台)。它限制了完全使用SQL Server,因此它又回到了数据库项目


这是一个妥协的世界,很抱歉,最佳实践有很多局限性。

我个人认为你采取的方法没有任何问题。我最近刚刚在脑海中解决了一个类似的难题,唯一的区别是我在数据层中有
EntityTypeConfiguration
类,而不是在模型中。我也在这些映射类中执行所有映射逻辑;这意味着我不必用EF特定的属性来修饰我的模型,使它们完全不受影响

按照您的方法,在
OnModelCreating
方法中,您只需要为每个要持久化的类保留一行代码,另外,如果您不清除EF创建的缓存,则此代码只命中一次,因此它只是一种一次性引导,因此长方法不是问题


我认为你的方法很好,但我相信在这个问题上会有一些不同的观点。

我个人认为你采取的方法没有问题。我最近刚刚在脑海中解决了一个类似的难题,唯一的区别是我在数据层中有
EntityTypeConfiguration
类,而不是在模型中。我也在这些映射类中执行所有映射逻辑;这意味着我不必用EF特定的属性来修饰我的模型,使它们完全不受影响

按照您的方法,在
OnModelCreating
方法中,您只需要为每个要持久化的类保留一行代码,另外,如果您不清除EF创建的缓存,则此代码只命中一次,因此它只是一种一次性引导,因此长方法不是问题


我认为你的方法很好,但我相信在这个问题上会有一些不同的观点。

是的,我真的认为整洁或类似的DAL是更好的选择。对于所有的noob魔法来说,当你想要处理大量的数据,并且你总是受到惯例的限制时,它似乎是缓慢而笨拙的。不确定。到目前为止,我使用BlToolkit的速度非常快——在一个处理数亿行的项目中,我将96核SSD支持的ExaData服务器与24核Intel服务器进行了混合——但现在我正在转向一个交易项目的EntityFramework。这就是说:我不做数据库维护,因为我在数据库中还有存储过程、视图、多个文件组和其他一些代码首先不知道的特性。EF中的代码优先仍然非常有限。是的,我真的不想使用它。这是强加给我的。现在我必须充分学习它,以便下次能够说“不”,尽管我必须承认这对一个想法的快速发展非常有益。麻烦你,当这个想法变成现实时,它不是很可持续的。这要看情况而定。对于大多数场景,“在表、关系和索引中定义字段”可能就足够了。当您还需要视图、设置存储过程、触发器、使用调优(文件组)或开始使用企业功能(表分区)时,情况会有所不同。@Peter这是非常可持续的(尤其是代码优先迁移——让您的源代码控制整个数据库历史,这太棒了)--比维护堆积如山的SQL脚本更容易另外,人们抱怨的很多其他东西(如视图等)都出现在他们的特色路线图上。。。所以它就要来了。是的,我真的认为整洁或类似的木偶是更好的选择。对于所有的noob魔法,它似乎只是slo