Соглашения об именах 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;}
}