EF Core将区分符列添加到拥有的实体

时间:2019-02-21 21:48:18

标签: entity-framework ef-core-2.2

因此,我的实体有一个拥有实体的两个属性。出于某种原因,EF Core正在其中之一添加区分符列。如果有人可以帮助我弄清楚我在做什么错,或者这里有一些奇怪的错误,那就太好了。

这是整个实体,尽管我怀疑只有RequestedApproved是相关的。

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:

enter image description here

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

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

我尝试将Approved重命名为ApprovedA,这没有什么区别。

然后,我尝试了类似这样的小型复制程序,不会创建区分项列:

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

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

}

现在我没主意了,需要一些帮助。


更新1:

戴上帽子,一切都会变得很奇怪!

当我将Approved重命名为Donkey时,鉴别符列消失了

enter image description here

几乎陌生的是,当我尝试在小型测试中使用“已批准”的名称来复制它时,我仍然没有在此处找到“鉴别符”列。


更新2:

所以我尝试了很多其他名字。成功意味着没有歧视列。

Xpproved =成功 应用=失败 Ap =失败 CrAp =成功 A =失败 Axx =成功 已批准XX =失败 XApproved =成功

这启发了我尝试使用Xstrong 有效

的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; }

1 个答案:

答案 0 :(得分:0)

虽然我不完全理解问题(为什么更改名称使问题消失了),但我发现它并没有真正解决问题。而是只是将其移动。上面@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没有映射到模型中!