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

时间:2012-11-25 21:17:30

标签: c# ef-code-first entity-framework-5

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

我喜欢这个,因为它让我在配置实例方面有了更多的灵活性。

2 个答案:

答案 0 :(得分:3)

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

这是一个妥协的世界,而且 - 抱歉 - 最佳做法伴随着一些限制。

答案 1 :(得分:2)

我个人认为你所采取的方法没有问题。我刚刚在脑海中解决了类似的困境,唯一的区别是我的数据层中有EntityTypeConfiguration<T>个类而不是我的模型。我也在做这些映射类中的所有映射逻辑;这意味着我不必用EF特定的属性来装饰我的模型,让它们完全没有持久性。

使用您的方法,在OnModelCreating方法中,您只需要为每个类保留一行,并且如果您不清除EF创建的缓存,则只会触发此代码一次,所以它只是一种一次性的自举,因此一个长期的方法不是问题吗?

我认为你的做法很好,但我确信会对这个问题有不同看法。