实体框架复杂类型's列命名约定

本文关键字:命名约定 框架 复杂 类型 实体 | 更新日期: 2023-09-27 18:18:27

使用复杂类型时,默认的列命名约定使用下划线。这意味着这样定义类型:

[ColmplexType]
public class Contact
{
    string Email {get;set;}
    string Post {get;set;}
}
public EntityN
{
    //...
    public Contact Contact {get;set;}
}

我们将得到这样命名的列

Contact_Email nvarchar(max)
Contact_Post nvarchar(max)

我们当然可以使用ColumnAttribute或Context分别配置每个列名。属性映射,但是我们是否有可能创建命名约定,从而为当前类型一次配置所有名称?

对于一些复杂类型,我宁愿不提及属性名称("Contact"),对于其他使用CammelCase连接名称和属性的类型,并且永远不会使用under酸痛。

讨论:

    public class CustomComplexTypeAttributeConvention : ComplexTypeAttributeConvention
    {
        public override void Apply(ConventionTypeConfiguration configuration, ComplexTypeAttribute attribute)
        {
            Properties().Where(pi => pi.DeclaringType == typeof(Contact))
               .Configure(p => p.HasColumnName(p.ClrPropertyInfo.Name)
            );
            base.Apply(configuration, attribute);
        }
    }

和OnModelCreating

modelBuilder.Conventions.AddBefore<ComplexTypeAttributeConvention>(new CustomComplexTypeAttributeConvention());

它工作,但我不确定这是一个正确的编码方式:1)"AddBefore"是否按预期工作(我不想删除默认行为,只是想覆盖默认行为的一种情况)?2)将"自定义代码"放在Apply方法或构造函数的最佳选择。

complextype attributecconvconvention的断点和反汇编带来了一个想法,即我们不重写"默认"命名约定,而是利用"循环"遍历"所有类型的所有属性"。

这看起来是最可靠的解决方案,但它仍然是一个"hack"(它不覆盖默认的"underscore"约定,而是模仿"ColumnAttribute"的呈现):

    public class BriefNameForComplexTypeConvention<T> : Convention
    {
        public BriefNameForComplexTypeConvention()
        {
            Properties().Where(pi => pi.DeclaringType == typeof(T))
               .Configure(p => p.HasColumnName(p.ClrPropertyInfo.Name)
            );
        }
    }
    // ...
    modelBuilder.Conventions.Add(new BriefNameForComplexTypeConvention<Contact>());

实体框架复杂类型's列命名约定

我以前从未这样做过,但值得尝试ComplexTypeAttributeConvention,您可以删除默认的并添加自定义的DbModelBuilder.Conventions:

public class CustomComplexTypeAttributeConvention : ComplexTypeAttributeConvention {
    public CustomComplexTypeAttributeConvention(){
       Properties().Configure(p => p.HasColumnName(p.ClrPropertyInfo.Name));
    }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder){
   modelBuilder.Conventions.Remove<ComplexTypeAttributeConvention>();
   modelBuilder.Conventions.Add(new CustomComplexTypeAttributeConvention());
   //...
}