【问题标题】:Entity Framework 5 - Deleting Child RecordsEntity Framework 5 - 删除子记录
【发布时间】:2014-03-12 04:21:48
【问题描述】:

VS 2012(11.0.60315.01 更新 2),C# 5,实体框架 5.0.0.0(运行时 v4.0.30319)

我知道过去曾发布过类似的问题,但似乎没有答案。我想我理解这个错误,但我更感兴趣的是找到“想要的”解决方案。 我要做的就是从 Child 表中删除一条记录。有人可以帮忙吗?

这是一个完整简单示例。 SaveChanges() 抛出以下异常:

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

代码如下所示:

using System.Linq;

namespace EFDeleteTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (EFTestEntities context = new EFTestEntities())
            {
                var parent = context.Parents.Single(p => p.Id == 1);

                var child = parent.Children.Single(c => c.Id == 1);

                parent.Children.Remove(child);

                context.SaveChanges(); // Throws the above Exception
            }
        }
    }
}

数据库如下所示:

Parent
    Id   (PK, int, not null)   IDENTITY
    Name (nvarchar(50), null)

Child
    Id       (PK, int, not null)  IDENTITY
    ParentId (FK, int, not null)  -- Foreign Key to the Parent Table (Id column))
    Name     (nvarchar(50), null)

Parent 表中有 1 条记录(Id = 1),Child 表中有 2 条记录(Id 的 1 和 2)。两条子记录的 ParentId = 1。

【问题讨论】:

  • 你应该在你的问题中包含更多的标签,例如C#VS2012标签等。这样你会得到更多的观点和回应。

标签: c# visual-studio-2012 entity-framework-5


【解决方案1】:

如果您只想删除子对象,则逻辑中不应该关注父对象。试试下面的代码,让我知道会发生什么(未测试)。

using System.Linq;

namespace EFDeleteTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (EFTestEntities context = new EFTestEntities())
            {                      
                var child = context.Children.Single(c => c.Id == 1);

                context.Children.Remove(child);

                context.SaveChanges();
            }
        }
    }
}

【讨论】:

  • Komenge,你的代码成功了。我的主要项目(目前无法访问)可能比这个例子复杂一点,但我确信我可以调整它以类似的方式工作。感谢您的快速回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 2015-01-27
  • 1970-01-01
  • 2019-08-22
  • 2021-03-29
  • 2016-11-09
  • 1970-01-01
相关资源
最近更新 更多