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

2023-12-23

我有一个简单的 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; }
}

我按照中所述建立了关系文档 https://learn.microsoft.com/en-us/ef/core/modeling/owned-entities使用 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](但这是预料之中的,因为它是明确提到 https://learn.microsoft.com/en-us/ef/core/modeling/relational/default-values).

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

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

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());
}

那么这是正确的方法还是还有其他事情需要记住?


假设您了解 EF Core默认值 https://learn.microsoft.com/en-us/ef/core/modeling/relational/default-values是为了,并且只是寻找相当于Entity<T>().Property(...)相等的。

始终使用以下方法为每个所有者类型配置拥有的实体ReferenceOwnershipBuilder<TEntity,TRelatedEntity>类方法。要访问此类,您可以使用以下结果OwnsOne https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.metadata.builders.entitytypebuilder-1.ownsone?view=efcore-2.0#Microsoft_EntityFrameworkCore_Metadata_Builders_EntityTypeBuilder_1_OwnsOne__1_System_Linq_Expressions_Expression_System_Func__0___0___方法,或使用OwnsOne https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.metadata.builders.entitytypebuilder-1.ownsone?view=efcore-2.0#Microsoft_EntityFrameworkCore_Metadata_Builders_EntityTypeBuilder_1_OwnsOne__1_System_Linq_Expressions_Expression_System_Func__0___0___System_Action_Microsoft_EntityFrameworkCore_Metadata_Builders_ReferenceOwnershipBuilder__0___0___采用类型的第二个参数的重载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.
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐