我有兩個抽象類,有兩個相應的派生類,如下所示(簡化,當然):實體框架,標誌着外鍵關係爲空,即使它是不是
public abstract class Activity
{
public int ID { get; set; }
public int ScheduleID { get; set; }
public DateTime StartTime { get; set; }
}
public class ProjectActivity : Activity
{
}
public abstract class Schedule
{
public int ID { get; set; }
protected List<Activity> _entries;
public List<Activity> Entries
{
get { return _entries.OrderBy(e => e.StartTime).ToList(); }
set { _entries = value; }
}
protected SiteSchedule()
{
_entries = new List<Activity>();
}
}
public class ProjectSchedule : Schedule
{
}
這些類存在於數據庫使用TPH(按層次結構)構造。所以我有一個Activity
表和一個Schedule
表,它們都帶有一個鑑別器列。
當我試圖挽救這樣一個非常簡單的關係:
ProjectSiteSchedule schedule = new ProjectSchedule();
context.Schedules.Add(schedule);
context.SaveChanges();
ProjectActivity activity = new ProjectActivity()
{
ScheduleID = schedule.ID,
};
context.Activities.Add(activity);
context.SaveChanges();
我收到以下錯誤:
The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
的導航屬性設置爲故意單向關係。
modelBuilder.Entity<Schedule>()
.HasMany(s => s.Entries)
.WithRequired()
.HasForeignKey(e => e.ScheduleID)
.WillCascadeOnDelete(false);
這是一個非常奇怪的事情,因爲ScheduleID
正確的ProjectActivity
對象上設置:在流利的API,我定義如下的關係。但是,出於測試目的,我將ScheduleID
更改爲可爲空的字段,但可以保存ProjectActivity
,但在數據庫中將ScheduleID
設置爲null
,即使它已在代碼中設置。
看起來實體框架在嘗試保存時將ScheduleID
屬性從給定的整數更改爲null
值。我嘗試了this answer中給出的'骯髒的技巧'來檢查實體的狀態,然後它會嘗試保存它,但即使它作爲_entriesWithConceptualNulls
條目返回實體,ScheduleID
也已正確設置。
你'名單 Entries'吸氣看起來麻煩......請檢查你沒有改變返回列表字段中的問題是否仍然存在。 –
grek40
無法用你的例子重現,你在什麼版本的EF上?另外,請在遷移後創建這些表格,因爲我在「ScheduleId」中添加並保存了一個有效值。 –
@ grek40你是對的。 '.ToList()'調用導致錯誤。這很奇怪,因爲'_entries'本身就是一個列表。所以如果我通過一個沒有改變的列表一切都正常,但如果我列出這個列表,將它重新列爲一個列表並返回它,它不起作用。 – Kazu