C# 实体框架将外键关系标记为空,即使它不是空的

C# 实体框架将外键关系标记为空,即使它不是空的,c#,entity-framework,C#,Entity Framework,我有两个抽象类,分别有两个派生类,如下所示(当然是简化的): 我得到以下错误: 操作失败:无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象 导航属性被故意设置为单向关系。在Fluent API中,我定义了如下关系: modelBuilder.Entity<Schedule>() .HasMany(s => s.Entries)

我有两个抽象类,分别有两个派生类,如下所示(当然是简化的):

我得到以下错误:

操作失败:无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象

导航属性被故意设置为单向关系。在Fluent API中,我定义了如下关系:

modelBuilder.Entity<Schedule>()
    .HasMany(s => s.Entries)
    .WithRequired()
    .HasForeignKey(e => e.ScheduleID)
    .WillCascadeOnDelete(false);
modelBuilder.Entity()
.HasMany(s=>s.Entries)
.WithRequired()
.HasForeignKey(e=>e.ScheduleID)
.WillCascadeOnDelete(假);
这是一件非常奇怪的事情,因为在
ProjectActivity
对象上正确设置了
ScheduleID
。但是,出于测试目的,我将
ScheduleID
更改为可为空的字段时,可以保存
ProjectActivity
,但数据库中的
ScheduleID
设置为
null
,即使它是在代码中设置的


实体框架似乎在尝试保存时将
ScheduleID
属性从给定整数更改为
null
值。我尝试了中给出的“脏把戏”来检查实体在试图保存它之前的状态,但即使它返回实体作为带有ConceptualNulls的
\Entries
条目,也正确设置了
ScheduleID

问题在于导航属性
条目

protected List<Activity> _entries;
public List<Activity> Entries
{
    //don't create a new list in getter!
    //get { return _entries.OrderBy(e => e.StartTime).ToList(); }
    get { return _entries; }
    set { _entries = value; }
}

问题在于导航属性
条目

protected List<Activity> _entries;
public List<Activity> Entries
{
    //don't create a new list in getter!
    //get { return _entries.OrderBy(e => e.StartTime).ToList(); }
    get { return _entries; }
    set { _entries = value; }
}

您的
列表条目
getter看起来有问题。。。请检查返回列表字段时问题是否仍然存在。无法用您的示例重现,您使用的是什么版本的EF?另外,请发布迁移以创建这些表,因为我在
ScheduleId
@grek40中添加并保存了一个有效值,您是对的。调用
.ToList()
会导致错误。这很奇怪,因为
\u条目本身就是一个列表。因此,如果我传递一个列表而不做任何更改,一切正常,但如果我对该列表排序,将其重新设置为列表,然后返回,则该列表无效。@Kazu您没有重新设置它,而是返回了一个新的列表实例。EF正在使用collection属性跟踪添加的子项,当然失败了,因为它将子项添加到新创建的列表中(即no where)。在模型课上千万不要这样做。@IvanStoev当然。这很有道理。感谢您的澄清。您的
列表条目
getter看起来很麻烦。。。请检查返回列表字段时问题是否仍然存在。无法用您的示例重现,您使用的是什么版本的EF?另外,请发布迁移以创建这些表,因为我在
ScheduleId
@grek40中添加并保存了一个有效值,您是对的。调用
.ToList()
会导致错误。这很奇怪,因为
\u条目本身就是一个列表。因此,如果我传递一个列表而不做任何更改,一切正常,但如果我对该列表排序,将其重新设置为列表,然后返回,则该列表无效。@Kazu您没有重新设置它,而是返回了一个新的列表实例。EF正在使用collection属性跟踪添加的子项,当然失败了,因为它将子项添加到新创建的列表中(即no where)。在模型课上千万不要这样做。@IvanStoev当然。这很有道理。谢谢你的澄清。
protected List<Activity> _entries;
public List<Activity> Entries
{
    //don't create a new list in getter!
    //get { return _entries.OrderBy(e => e.StartTime).ToList(); }
    get { return _entries; }
    set { _entries = value; }
}
[NotMapped]
public IEnumerable<Activity> OrderedEntries
{
    get { return _entries.OrderBy(e => e.StartTime); }
}