如何在Entity Framework Core 2.0中为拥有的实体类型指定默认属性值? [英] How to specify default property values for owned entity types in Entity Framework Core 2.0?
问题描述
我有一个简单的POCO类型,例如
I have a simple POCO type, say something like
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:
I set up the relationship like described in the documentation using EF Core's Fluent API:
protected override void OnModelCreating (ModelBuilder builder) {
base.OnModelCreating (builder);
builder.Entity<SomeEntity> ().OwnsOne (e => e.OwnedEntity);
}
关于如何为<$的所有属性定义默认值,我找不到任何东西c $ c> OwnedEntity 。我试图像这样初始化属性:
I can't find anything on how to define default-values for all the properties of OwnedEntity
. I tried to initialize the properties like this:
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]
也是如此(但这是意料之中的,因为它是明确提及)。
but with no effect. Same goes with the [DefaultValueAttribute]
(but that was to expect since it's explicitly mentioned).
有关如何处理常规实体的初始值的一些信息:
There's a bit of information on how to handle initial values for regular entities:
modelBuilder.Entity<SomeOtherEntity>()
.Property(e => e.SomeIntProperty)
.HasDefaultValue(3);
但是由于我遇到的是拥有实体类型,所以无法通过访问类型实体< T>
。
But since I'm facing an Owned Entity Type, I can't access the type via Entity<T>
.
有没有一种方法可以满足我的需求?
Is there a way of doing what I'm looking for?
有些东西值得提到:
- 我有很多特定实体,其中大多数都使用
OwnsOne
关系 - 在基类中声明所有
OwnedEntity
-属性不是一种选择,因为并非所有实体都具有这些属性 - 我使用EF Core 2.0.3和ASP.NET Core MVC 2.0.4
- I have a solid amount of specific entities where most of them are using the
OwnsOne
relation - Declaring all
OwnedEntity
-properties in a base class is not an option since not all the entities have those properties - I`m using EF Core 2.0.3 and ASP.NET Core MVC 2.0.4
最初,我想新创建一个 SomeEntity
实例,以便为所有嵌入式 SomeEntity.OwnedEntity预置属性。
属性。
Originally, I wanted to have newly created SomeEntity
instances to come with preset properties for all of the 'embedded' SomeEntity.OwnedEntity
properties.
但是看看我的关联控制器是如何工作的,这一切都说得通...我对创建操作有以下方法:
But looking at how my associated controller works, it all makes sense... I have the following methods for the 'Create' operation:
[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.
}
这意味着未创建任何对象用于 Create
的 [HttGet]
重载以及链接到属性的所有HTML输入(通过 as-for
)最初是空的。好的。所以我想这样做的正确方法是手动创建 SomeEntity
的新实例,并将其传递给 Create
像这样的视图:
Which means that no object is created for the [HttGet]
overload of Create
and all the HTML inputs linked to properties (via asp-for
) are initially empty. Okay. So I guess the proper way of doing this is to manually create a new instance of SomeEntity
and pass it to the Create
view like this:
[HttpGet]
public IActionResult Create () {
return View (nameof (Create), new SomeEntity());
}
那么这是正确的方法还是要记住更多事情?
Is this the right approach then or are there some more things to keep in mind?
推荐答案
假设您了解EF Core是什么默认值适用于此,并且仅查找 Entity< T>()。Property(...)
等价物。
Assuming you understand what EF Core Default Values are for, and just looking for equivalent of Entity<T>().Property(...)
equivalent.
始终使用 ReferenceOwnershipBuilder< TEntity,TRelatedEntity>
类方法为每种所有者类型配置拥有的实体。要访问此类,请使用 OwnsOne
方法,或使用重载类型为 Action< ReferenceOwnershipBuilder< TEntity,TRelatedEntity>>
的第二个参数。
The owned entities are always configured for each owner type by using the ReferenceOwnershipBuilder<TEntity,TRelatedEntity>
class methods. To access this class you either use the result of OwnsOne
method, or use the OwnsOne
overload taking second argument of type Action<ReferenceOwnershipBuilder<TEntity,TRelatedEntity>>
.
例如,使用第二种方法:
For instance, using the second approach:
builder.Entity<SomeEntity>().OwnsOne(e => e.OwnedEntity, ob =>
{
ob.Property(e => e.stringProperty)
.HasDefaultValue("initial");
ob.Property(e => e.decimalProperty)
.HasDefaultValue(-1M);
// etc.
});
这篇关于如何在Entity Framework Core 2.0中为拥有的实体类型指定默认属性值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!