我在项目中使用域驱动设计模式。我有一些ValueObjects喜欢 PersianDate ,它具有long类型属性。数据库中ValueObject属性的名称为CreatedOn_PersianDate但我希望其名称为CreatedOn。我可以直接更改此属性,但如何通过约定来执行此操作? (FixOValueObjectAttributeConvention)
public class PersianDate : ValueObject<PersianDate>
{
public long Value {get; set;}
}
public class Account : Entity
{
public int Id {get; set;}
public PersianDate CreatedOn {get; set;}
}
public class TestContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add(new FixObjectValueAttributeConvention());
base.OnModelCreating(modelBuilder);
}
}
答案 0 :(得分:1)
您可能已经注意到EF的复杂类型属性的命名约定是
Property name + "_" + Property name in complex type
因此,默认情况下,CreatedOn
将映射为CreatedOn_Value
。 (据我所知,不是你提到的名字CreatedOn_PersianDate
,但对后面的内容并不重要。)
您可以创建自定义代码优先约定来修改它。我向你展示了一个删除这个&#34; _Value&#34;类型long
(bigint)的每个属性的后缀:
class PersionDateNamingConvention : IStoreModelConvention<EdmProperty>
{
public void Apply(EdmProperty property, DbModel model)
{
if (property.TypeName == "bigint" && property.Name.EndsWith("_Value"))
{
property.Name = property.Name.Replace("_Value", string.Empty);
}
}
}
当然,您可以根据需要微调条件。
您必须将此约定添加到模型构建器(在OnModelCreating
中)才能使其生效:
modelBuilder.Conventions.Add(new PersionDateNamingConvention());
答案 1 :(得分:0)
您可以使用DataAnnotations
执行此操作列属性可以应用于类的属性。默认代码优先约定创建与属性名称相同的列名称。列属性会覆盖此默认约定。 EF Code-First将在给定属性的Column属性中创建一个具有指定名称的列。
所以你的模型将是:
public class Account : Entity
{
public int Id {get; set;}
[Column("CreatedOn")]
public PersianDate CreatedOn {get; set;}
}