gpt4 book ai didi

c# - Entity Framework 复杂类型的列命名约定

转载 作者:太空狗 更新时间:2023-10-30 01:33:37 25 4
gpt4 key购买 nike

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

[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.Properties 映射分别配置每个列名称,但是我们是否有可能创建命名约定并因此一次性为当前类型配置所有名称?

对于某些复杂类型,我宁愿完全不提及属性名称(“Contact”),对于其他使用 CammelCase 连接名称和属性的类型,永远不会使用 undersore。

讨论:

可行(为特定表创建配置信息)

    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 方法或构造函数的最佳选择在哪里。

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

这看起来像是最可靠的解决方案,但它仍然是一个“黑客”(它不会覆盖默认的“下划线”约定,而是模拟“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>());

最佳答案

我以前从未这样做过,但值得尝试 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());
//...
}

关于c# - Entity Framework 复杂类型的列命名约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33238109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com