C# 未将导航属性设置为null保存到数据库中

C# 未将导航属性设置为null保存到数据库中,c#,entity-framework,C#,Entity Framework,我是EF的新手,我遇到了一种情况,实体的行为方式与我预期的不一样。如果能帮助我理解这是EF中的错误还是我理解中的“错误”,我将不胜感激 我把所有的代码都放在了帖子的末尾;它应该在安装了Entity6的测试项目中编译和运行 情况是这样的 我先用代码 我在多对一关系中有两个实体。这是: public class OneSideEntity { public int OneSideEntityId { get; set; } public string Name

我是EF的新手,我遇到了一种情况,实体的行为方式与我预期的不一样。如果能帮助我理解这是EF中的错误还是我理解中的“错误”,我将不胜感激

我把所有的代码都放在了帖子的末尾;它应该在安装了Entity6的测试项目中编译和运行

情况是这样的

我先用代码

我在多对一关系中有两个实体。这是:

public class OneSideEntity
    {
        public int OneSideEntityId { get; set; }
        public string Name { get; set; }
        public virtual List<ManySideEntity> MyManySideEntities { get; set; }
    }

    public class ManySideEntity
    {
        public int ManySideEntityId { get; set; }
        public string Name { get; set; }
        public virtual OneSideEntity MyOneSideEntity { get; set; }
    }

您似乎没有定义这两个类之间的关系。您缺少以下方面的定义:

.HasRequired(...).WithMany(...)

有关更多信息,请参见,我已经弄清楚了发生了什么。当我设置
many.MyOneSideEntity=null时,实体的更改跟踪程序已捕获初始值“null”。因此,从实体的角度来看,属性的值没有变化,因此即使属性的值与数据库中的值不同,变更跟踪器也不认为需要更新属性

要解决此问题,只需通过getter访问属性。这会将实体的状态加载到内存中,并将更改跟踪器与这些值同步。然后,更改跟踪器通过将属性设置为null来注意到所做的更改,并在调用SaveChanges时将更改推送到数据库中

我不得不这么做有点奇怪,但它符合实体的变更跟踪程序的工作方式


希望这对其他人有帮助

据我所知,实体使用约定(在本例中是导航属性的存在)来推断关系。如果查看创建的数据库,您将看到类之间正确的外键关系。添加此项不会改变行为。感谢您抽出时间尝试回答!如果您有一个FK ID字段(
MyOneSideEntityId
),您只需将其设置为null,SaveChanges就会删除该引用。如果您更新ID字段而不是实体(如您所说,如果您按实体进行更新,则必须首先从数据库中加载),则更改跟踪器工作得更好。这简直是胡说八道,而且它使得无法将大型代码库从ObjectContext迁移到dbContext,因为它过去只需设置null即可工作。。。有其他的解决方案吗?
.HasRequired(...).WithMany(...)