DDD ValueObjects的EntityFramework命名约定

时间:2016-05-15 19:06:49

标签: c# entity-framework ef-code-first domain-driven-design value-objects

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

2 个答案:

答案 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;}
}