entity-framework - EF Core HasMany 与 OwnsMany
问题描述
对于一对多关系,HasMany和OwnsMany有什么区别?我什么时候应该使用一个而不是另一个?
例如:
public class xxx
{
public virtual IReadOnlyCollection<xxxHistoryEntity> Histories => _histories;
private readonly List<xxxHistoryEntity> _histories = new List<xxxHistoryEntity>();
}
public class xxxHistoryEntity : Entity<string>
{
public string State { get; set; }
public string NodeId { get; set; }
public string Message { get; set; }
}
实体配置:
class xxxConfiguration
: IEntityTypeConfiguration<xxx>
{
public void Configure(EntityTypeBuilder<xxx> builder)
{
builder.OwnsMany(itm => itm.Histories, collbuilder =>
{
collbuilder.HasForeignKey("xxxid");
});
}
}
class xxxHistoryConfiguration
: IEntityTypeConfiguration<xxxHistoryEntity>
{
public void Configure(EntityTypeBuilder<xxxHistoryEntity> builder)
{
builder.ToTable("xxx_histories");
builder.HasKey(itm => itm.Id);
builder.Property(itm => itm.Id)
.ValueGeneratedOnAdd();
}
}
生成的迁移如下:
migrationBuilder.CreateTable(
name: "xxx_histories",
columns: table => new
{
id = table.Column<string>(nullable: false),
xxxid = table.Column<string>(nullable: false),
state = table.Column<string>(nullable: true),
nodeid = table.Column<string>(nullable: true),
message = table.Column<string>(nullable: true),
xmin = table.Column<uint>(type: "xid", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_xxx_histories", x => new { x.id, x.xxxid });
table.ForeignKey(
name: "fk_xxxhistoryentity_xxx_xxxarid",
column: x => x.xxxid,
principalTable: "xxx",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
});
如果我通过用 HasMany 替换OwnsMany 来更新xxxConfiguration ,例如:
class xxxConfiguration
: IEntityTypeConfiguration<xxx>
{
public void Configure(EntityTypeBuilder<xxx> builder)
{
builder.HasMany(itm => itm.Histories)
.WithOne()
.HasForeignKey("xxxid");
}
}
生成的迁移如下:
migrationBuilder.CreateTable(
name: "xxx_histories",
columns: table => new
{
id = table.Column<string>(nullable: false),
xxxid = table.Column<string>(nullable: false),
state = table.Column<string>(nullable: true),
nodeid = table.Column<string>(nullable: true),
message = table.Column<string>(nullable: true),
xmin = table.Column<uint>(type: "xid", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_xxx_histories", x => new { x.id, x.xxxid });
table.ForeignKey(
name: "fk_xxxhistoryentity_xxx_xxxid",
column: x => x.xxxid,
principalTable: "xxx",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
});
可以看到,两者产生的迁移是一样的。那么,OwnsMany 的意义何在?
解决方案
从文档:
EF Core 允许您对只能出现在其他实体类型的导航属性上的实体类型进行建模。这些被称为拥有的实体类型。包含拥有实体类型的实体是其所有者。
拥有的实体本质上是拥有者的一部分,没有它就无法存在,它们在概念上类似于聚合。
https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities
推荐阅读
- javascript - 如何使用 mongo 比较值和组?
- node.js - & 在查询字符串参数中未检测到
- spring - Spring Data JPA 自定义接口的转换错误
- c# - 同一解决方案中两个不同项目的相同 Nuget 包
- c# - POST整数或字符串的正确RestRequest“Content-Type”是什么?
- json - 如何在 groovy 中获取 end_time 及其值
- ruby - 从类方法调用实例方法
- firebase - Firebase:查询我的用户参与的所有聊天室
- php - 如何避免覆盖 Symfony 验证组?
- python - 错误:从 ipykernel import kernelapp as app 乘法遇到溢出