我在项目中使用域驱动设计模式。我有一些ValueObject,如PersianDate,具有长类型属性。数据库中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);
}
}
您可能注意到EF对复杂类型中的属性的命名约定是
Property name + "_" + Property name in complex type
因此,默认情况下,CreatedOn
将映射为CreatedOn_Value
。(据我所知,不是你提到的CreatedOn_PersianDate
这个名字,但这对后面的内容并不重要)。
您可以创建一个自定义的代码优先约定来对此进行修改。我向您展示了一个惯例,它为类型为long
(bigint)的每个属性删除这个"_Value"后缀:
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());
您可以使用DataAnnotations
列属性可以应用于类的属性。"默认代码优先"约定将创建与属性名称相同的列名。Column属性覆盖此默认约定。EF Code First将在给定属性的column属性中创建一个具有指定名称的列。
所以你的模型是:
public class Account : Entity
{
public int Id {get; set;}
[Column("CreatedOn")]
public PersianDate CreatedOn {get; set;}
}