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

qCr*_*ing 3 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; }
}
Run Code Online (Sandbox Code Playgroud)

和一个具有OwnedEntity参考的实际实体

public class SomeEntity {

    public string Id { get; set; }
    public OwnedEntity OwnedEntity { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我使用 EF Core 的 Fluent API 建立了文档中描述的关系:

protected override void OnModelCreating (ModelBuilder builder) {

    base.OnModelCreating (builder);

    builder.Entity<SomeEntity> ().OwnsOne (e => e.OwnedEntity);
}
Run Code Online (Sandbox Code Playgroud)

我找不到任何关于如何为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;
}
Run Code Online (Sandbox Code Playgroud)

但没有效果。也一样[DefaultValueAttribute](但这是预料之中的,因为它被明确提到)。

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

modelBuilder.Entity<SomeOtherEntity>()
        .Property(e => e.SomeIntProperty)
        .HasDefaultValue(3);
Run Code Online (Sandbox Code Playgroud)

但是由于我面对的是拥有的实体类型,因此我无法通过Entity<T>.

有没有办法做我正在寻找的东西?

一些值得一提的事情:

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

编辑:

最初,我希望新创建的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.
}
Run Code Online (Sandbox Code Playgroud)

这意味着不会为 的[HttGet]重载创建任何对象,Create并且所有链接到属性(通过asp-for)的 HTML 输入最初都是空的。好的。所以我想这样做的正确方法是手动创建一个新实例SomeEntity并将其传递给这样的Create视图:

[HttpGet]
public IActionResult Create () {
    return View (nameof (Create), new SomeEntity());
}
Run Code Online (Sandbox Code Playgroud)

那么这是正确的方法还是有更多的事情要记住?

Iva*_*oev 5

假设您了解 EF Core默认值的用途,并且只是寻找等效的Entity<T>().Property(...)等效项。

始终使用ReferenceOwnershipBuilder<TEntity,TRelatedEntity>类方法为每个所有者类型配置拥有的实体。要访问此类,您可以使用OwnsOnemethod的结果,或者使用OwnsOne带有 type 的第二个参数的重载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.
});
Run Code Online (Sandbox Code Playgroud)