首页 > 解决方案 > EF Core 将鉴别器列添加到拥有的实体

问题描述

所以我的实体有两个拥有实体的属性。出于某种原因,EF Core 正在向其中之一添加一个鉴别器列。如果有人可以帮助我找出我做错了什么或者这里是否有一些奇怪的错误,那就太好了。

这是整个实体,尽管我只是怀疑Requested并且Approved是相关的。

public class Absence
    {
        public Absence()
        {
            Requested = new AuditInfo();
            Approved = new AuditInfo();
        }

        public Guid Id { get; set; }

        public DateTime StartDate { get; set; }
        public DateTime? EndDate { get; set; }

        public AbsenceType Type { get; set; }
        public AbsenceState State { get; set; }

        public AuditInfo Requested { get; set; }
        public AuditInfo Approved { get; set; }

        public Guid EmployeeId { get; set; }
        public Employee Employee { get; set; }

        public ICollection<AbsenceDay> Days { get; set; }

    }

Absence没有任何特殊映射,但 AuditInfo 映射为

x.Owned<AuditInfo>();

这主要生成预期的 SQL,除了这个奇怪的项目:

在此处输入图像描述

这也导致代码在运行时失败并显示以下消息:

Message: Microsoft.EntityFrameworkCore.DbUpdateException : An error occurred while updating the entries. See the inner exception for details.
---- System.Data.SqlClient.SqlException : Cannot insert the value NULL into column 'ApprovedA_Discriminator', table 'bokio-test.dbo.Absences'; column does not allow nulls. INSERT fails.
The statement has been terminated.

我试过的:

我尝试像这样映射项目,这没有什么区别:

        x.Entity<Absence>().OwnsOne(x1 => x1.Approved);
        x.Entity<Absence>().OwnsOne(x1 => x1.Requested);

我尝试重命名ApprovedApprovedA没有任何区别。

然后我尝试了一个像这样的小型复制器,它不会创建鉴别器列:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Address HomeAddress { get; set; }
    public Address WorkAddress { get; set; }

}

现在我没有想法,需要一些帮助。


更新1:

抓住你的帽子,事情即将变得非常奇怪!

当我重命名ApprovedDonkey鉴别器列时消失

在此处输入图像描述

几乎奇怪的是,当我尝试在小测试中使用 Approved 名称对其进行复制时,我仍然没有在那里得到鉴别器列。


更新 2:

所以我尝试了一堆其他的名字。成功意味着没有鉴别器列。

Xpproved = 成功 App = 失败 Ap = 失败 CrAp = 成功 A = 失败 Axx = 成功 ApprovedXX = 失败 XApproved = 成功

这激发了我尝试使用 XApproved 的解决方案,该解决方案有效

x.Entity<Absence>().OwnsOne(x1 => x1.XApproved, o =>
{
    o.Property(x2 => x2.Ip).HasColumnName("Approved_Ip");
    o.Property(x2 => x2.UserAgent).HasColumnName("Approved_UserAgent");
    o.Property(x2 => x2.UserId).HasColumnName("Approved_UserId");
    o.Property(x2 => x2.TimeUtc).HasColumnName("Approved_TimeUtc");
});

更新 3:

AuditInfo 只有这些属性,除了存在之外没有任何映射Owned。它确实有一堆继承它的类:

public DateTime TimeUtc { get; set; }
public Guid? UserId { get; set; }
public string Ip { get; set; }
public string UserAgent { get; set; }

标签: entity-frameworkef-core-2.2

解决方案


虽然我不完全理解这个问题(为什么更改名称会使问题消失)但我注意到它并没有真正解决问题。而是只是移动它。上面@philreed 的评论是真正让它点击的原因。

AuditInfo被另一个拥有的实体继承ClosurePart。通过改变从

public class AuditInfo {
...props here
}

public class ClosurePart : AuditInfo {}

public class AuditInfoCommon {
...props here
}

public class AuditInfo : AuditInfoCommon {}

public class ClosurePart : AuditInfoCommon {}

这个问题在不需要黑客的情况下完全消失了。

注意: AuditInfoCommon 未映射到模型中!


推荐阅读