entity-framework - 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);
我尝试重命名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; }
解决方案
虽然我不完全理解这个问题(为什么更改名称会使问题消失)但我注意到它并没有真正解决问题。而是只是移动它。上面@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 未映射到模型中!
推荐阅读
- c++ - SDL 2,如何使用事件系统和异步绘制
- python - 数据驱动的测试。使用 Selenium Python 从 .json 或 .yaml 文件中读取参数
- php - 如何在 PHP 中删除 JSON 周围的方括号
- mysql - 包含日语的 XML 使用 MySQL 加载为 NULL
- javascript - 如何在 HTML 标签中使用 REACTJS 和 Context
- r - 我的插入符号“rf”模型中使用了多少棵树?
- mongodb - 在 MongoDB 中查询 UUID 类型值
- javascript - SugarCRM Javascript/JQuery 电话掩码没有像我希望的那样完全工作
- azure - Azure 托管的 .html 类型的 blob 间歇性地忽略绝对 href 并进行相对
- javascript - Javascript无法添加href