Соглашения об именах EntityFramework для DDO ValueObjects

Я использую шаблон, управляемый доменом, в своем проекте. У меня есть несколько объектов ValueObject, таких как 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 ответа

Вы, наверное, заметили, что соглашение EF о присвоении имен свойствам сложных типов

Property name + "_" + Property name in complex type

Так что по умолчанию CreatedOn будет отображаться как CreatedOn_Value, (Насколько я вижу, не название CreatedOn_PersianDate что вы упоминаете, но это не имеет значения для того, что следует).

Вы можете создать собственное соглашение о коде, чтобы изменить это. Я покажу вам соглашение, которое удаляет этот суффикс "_Value" для каждого свойства типа 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());

Вы можете сделать это, используя DataAnnotations

Атрибут столбца может быть применен к свойствам класса. Код по умолчанию Первое соглашение создает имя столбца, такое же как имя свойства. Атрибут столбца переопределяет это соглашение по умолчанию. EF Code-First создаст столбец с указанным именем в атрибуте Column для данного свойства.

Так что ваши модели будут:

public class Account : Entity
{
    public int Id {get; set;}

    [Column("CreatedOn")]
    public PersianDate CreatedOn {get; set;}
}
Другие вопросы по тегам