添加时实体框架核心设置拥有的实体为空

Sim*_*ode 3 c# entity-framework-core

我有以下图表:

public class Report
{
    public Guid Id { get; set; }
    public ICollection<EmployeeEntry> EmployeeEntries { get; set; }
}

public class EmployeeEntry
{
    public Guid Id { get; set; }
    public DateTimeOffset EntryDate { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public string City { get; set; }
    public string State { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并使用 fluentApi 我已将地址配置为实体拥有的实体,EmployeeEntry如下所示:

private void ConfigureEmployeeEntry(EntityTypeBuilder<EmployeeEntry> builder)
{
    builder.OwnsOne(x => x.Address, w =>
    {
        w.Property(x => x.City).HasMaxLength(100);
        w.Property(x => x.State).HasMaxLength(100);
    });
}
Run Code Online (Sandbox Code Playgroud)

但是当我有多个相同的地址EmployeeEntry并运行以下代码时:

dbContext.Reports.Add(report);
dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

“EmployeeEntry”类型的实体与“EmployeeEntry.Address#Address”类型的实体共享表“report.EmployeeEntries”,但没有该类型的实体具有标记为“Added”的相同键值。考虑使用 'DbContextOptionsBuilder.EnableSensitiveDataLogging' 来查看键值。

正如我注意到在SaveChanges()EF之前添加报告后,地址为null.

我正在使用最新版本的 EntityFramework 核心。

Iva*_*oev 6

但是当我有多个 EmployeeEntry 的相同地址时

如果您的意思是同一个Address 实例,则拥有的实体类型的EF Core 文档明确指出当前支持 - 在限制 - 当前缺点下

  • 拥有实体类型的实例不能被多个拥有者共享(这是无法使用拥有实体类型实现的值对象的众所周知的场景)

因此,要么确保使用不同的实例(即使具有相同的属性值),要么不使用拥有的实体类型,而是使用常规的实体类型和关系。