如何在Entity Framework Core 2.0中为拥有的实体类型指定默认属性值?

时间:2018-06-11 18:15:11

标签: asp.net entity-framework-core

我有一个简单的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设置了documentation中描述的关系:

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]也是如此(但是因为它是explicitly mentioned所期望的。

有关如何处理常规实体的初始值的一些信息:

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

但由于我面对的是自有实体类型,我无法通过Entity<T>访问该类型。

有没有办法做我正在寻找的事情?

值得一提的是:

  • 我有大量特定实体,其中大多数都使用OwnsOne关系
  • 声明基类中的所有OwnedEntity - 属性不是一个选项,因为并非所有实体都具有这些属性
  • 我正在使用EF Core 2.0.3和ASP.NET Core MVC 2.0.4

编辑:

最初,我想让新创建的SomeEntity个实例为所有&#39; embedded&#39;提供预设属性。 SomeEntity.OwnedEntity属性。

但是看看我的相关控制器是如何工作的,这一切都是有道理的......我有以下方法来创建&#39;操作:

[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]的{​​{1}}重载创建任何对象,并且链接到属性的所有HTML输入(通过Create)最初都是空的。好的。所以我想这样做的正确方法是手动创建asp-for的新实例并将其传递到SomeEntity视图,如下所示:

Create

这是正确的方法还是还有一些事情要记住?

1 个答案:

答案 0 :(得分:2)

假设您了解EF Core Default Values的用途,并且仅查找相当于Entity<T>().Property(...)的等效内容。

始终使用ReferenceOwnershipBuilder<TEntity,TRelatedEntity>类方法为每个所有者类型配置所拥有的实体。要访问此类,您可以使用OwnsOne方法的结果,也可以使用类型为Action<ReferenceOwnershipBuilder<TEntity,TRelatedEntity>>的第二个参数OwnsOne重载。

例如,使用第二种方法:

builder.Entity<SomeEntity>().OwnsOne(e => e.OwnedEntity, ob =>
{
    ob.Property(e => e.stringProperty)
        .HasDefaultValue("initial");
    ob.Property(e => e.decimalProperty)
        .HasDefaultValue(-1M);
    // etc.
});