DDD ValueObjects的EntityFramework命名约定



我在项目中使用域驱动设计模式。我有一些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;}
}

相关内容

  • 没有找到相关文章

最新更新