所以我的实体有两个拥有实体的属性。出于某种原因,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);
我尝试重命名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
鉴别器列时消失
几乎奇怪的是,当我尝试在小测试中使用 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; }