繁体   English   中英

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

[英]Entity Framework 5 code-first configuration encapsulation

我想知道(并且我讨厌使用“最佳实践”一词),但这是一种实现配置的好方法,因为它封装了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());
    }
}

而带有它的配置的类

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
        }
    }
}

我知道可能没有一种正确的办法 在我花很多时间和眼泪之前,我正在寻找一个原因,为什么这可能绝对是世界上最糟糕的想法,或者是否有办法做类似的事情?

编辑

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

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
   }
}

我喜欢它,因为它使我在配置实例方面更具灵活性。

这取决于。 到目前为止,我已经足够说我不在乎数据库生成了。 它很好,并且具有我不在乎的优点(与平台无关)。 它限制了不能完全使用SQL Server,因此又回到了数据库项目。

这是一个折衷的世界,而且-抱歉-最佳实践带有很多限制。

我个人认为您采用的方法没有问题。 我最近刚刚解决了一个类似的难题,唯一的区别是我在数据层内部而不是模型内部拥有EntityTypeConfiguration<T>类。 我也在这些映射类中完成所有映射逻辑。 这意味着我不必用EF特定的属性来修饰我的模型,而使它们完全没有持久性。

使用您的方法,在OnModelCreating方法中,每个类只需要保留一行即可持久化,而且如果您不清除EF创建的缓存,则只需单击此代码一次,因此,这只是一种-引导程序,因此长方法不是问题吗?

我认为您的方法很好,但是我敢肯定,在这个问题上会有一些不同的看法。

暂无
暂无

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

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