gpt4 book ai didi

entity-framework - EF Core 将鉴别器列添加到拥有的实体

转载 作者:行者123 更新时间:2023-12-05 06:27:58 24 4
gpt4 key购买 nike

所以我的实体有两个属性和一个拥有的实体。出于某种原因,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

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


更新 2:

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

Xpproved = 成功应用=失败Ap = 失败CrAp = 成功A = 失败Axx = 成功批准 XX = 失败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; }

最佳答案

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

AuditInfo 被另一个 Owned Entity ClosurePart 继承。通过改变从

public class AuditInfo {
...props here
}

public class ClosurePart : AuditInfo {}

public class AuditInfoCommon {
...props here
}

public class AuditInfo : AuditInfoCommon {}

public class ClosurePart : AuditInfoCommon {}

问题完全消失了,不需要 hack。

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

关于entity-framework - EF Core 将鉴别器列添加到拥有的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54816745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com