因此,我的实体有一个拥有实体的两个属性。出于某种原因,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
时,鉴别符列消失了
几乎陌生的是,当我尝试在小型测试中使用“已批准”的名称来复制它时,我仍然没有在此处找到“鉴别符”列。
更新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; }
答案 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没有映射到模型中!