Как указать значения свойств по умолчанию для типов собственных объектов в Entity Framework Core 2.0? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть простой тип POCO, скажем что-то вроде

public class OwnedEntity {

    public string stringProperty { get; set; }
    public decimal decimalProperty { get; set; }
    public bool boolProperty { get; set; }
    public int intProperty { get; set; }
}

и фактическая сущность со ссылкой OwnedEntity

public class SomeEntity {

    public string Id { get; set; }
    public OwnedEntity OwnedEntity { get; set; }
}

Я установил отношения, как описано в документация с использованием EF Core Fluent API:

protected override void OnModelCreating (ModelBuilder builder) {

    base.OnModelCreating (builder);

    builder.Entity<SomeEntity> ().OwnsOne (e => e.OwnedEntity);
}

Я не могу найти ничего о том, как определить значения по умолчанию для всех свойств OwnedEntity.Я попытался инициализировать свойства следующим образом:

public class OwnedEntity {

    public string stringProperty { get; set; } = "initial"
    public decimal decimalProperty { get; set; } = -1M;
    public bool boolProperty { get; set; } = false;
    public int intProperty { get; set; } = -1;
}

, но безрезультатно.То же самое относится и к [DefaultValueAttribute] (но этого следовало ожидать, поскольку в нем явно упоминается ).

Существует немного информации о том, как обрабатывать начальные значения для обычных сущностей:

modelBuilder.Entity<SomeOtherEntity>()
        .Property(e => e.SomeIntProperty)
        .HasDefaultValue(3);

Но так как я сталкиваюсь с Типом Owned Entity, я не могу получить доступ к типу через Entity<T>.

Есть ли способ сделать то, что я ищу?

Некоторые вещи, о которых стоит упомянуть:

  • У меня есть солидное количество определенных сущностей, большинство из которых используют OwnsOne отношение
  • Объявление всех OwnedEntity-свойства в базовом классе не вариант, так как не все объекты имеют эти свойства
  • Я использую EF Core 2.0.3 и ASP.NET Core MVC 2.0.4

Edit:

Изначально я хотел, чтобы недавно созданные SomeEntity экземпляры поставлялись с предустановленными свойствами для всех встроенных SomeEntity.OwnedEntity свойств.

Но, глядя на то, как моиконтроллер работает, все это имеет смысл ... У меня есть следующие методы для операции «Создать»:

[HttpGet]
public IActionResult Create () {
    return View (nameof (Create));
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create (SomeEntity model) {
    context.Add (model);
    await context.SaveChangesAsync ();

    // redirect etc.
}

Это означает, что для перегрузки [HttGet] Create не создается ни один объект, и всеHTML-входы, связанные со свойствами (через asp-for), изначально пусты.Хорошо.Поэтому я думаю, что правильный способ сделать это - вручную создать новый экземпляр SomeEntity и передать его в представление Create следующим образом:

[HttpGet]
public IActionResult Create () {
    return View (nameof (Create), new SomeEntity());
}

Это правильный подход или естьеще несколько вещей, чтобы иметь в виду?

1 Ответ

0 голосов
/ 11 июня 2018

Если вы понимаете, для чего EF Core Значения по умолчанию , и просто ищете эквивалент Entity<T>().Property(...) эквивалента.

Собственные объекты всегда настраиваются для каждого типа владельца с помощью методов класса ReferenceOwnershipBuilder<TEntity,TRelatedEntity>.Для доступа к этому классу вы либо используете результат метода OwnsOne, либо используете перегрузку OwnsOne, принимающую второй аргумент типа Action<ReferenceOwnershipBuilder<TEntity,TRelatedEntity>>.

ДляНапример, используя второй подход:

builder.Entity<SomeEntity>().OwnsOne(e => e.OwnedEntity, ob =>
{
    ob.Property(e => e.stringProperty)
        .HasDefaultValue("initial");
    ob.Property(e => e.decimalProperty)
        .HasDefaultValue(-1M);
    // etc.
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...