У меня есть простой тип 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());
}
Это правильный подход или естьеще несколько вещей, чтобы иметь в виду?