1

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

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

4

2 回答 2

3

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

这是一个妥协的世界,而且 - 抱歉 - 最佳实践伴随着大量的限制。

于 2012-11-25T21:38:19.000 回答
2

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

使用您的方法,在该OnModelCreating方法中,您只需要为每个要保留的类设置一行,此外,如果您不清除 EF 创建的缓存,则此代码仅被命中一次,因此它只是一种一次性的引导程序,因此长方法不是问题吗?

我认为您的方法很好,但我相信对此主题会有一些不同的看法。

于 2012-11-25T21:43:00.703 回答