在实体框架中将外键值设置回Null

克里斯·希夫豪尔(Chris Schiffhauer)

从记录中删除外键值时,我无法将记录保存到SQL Server数据库中。

例如,我有一个主键BatchDetailID = 10的现有BatchDetail记录,并且它与一个主键RunDetailID = 20,外键BatchDetailID = 10的现有RunDetail记录关联。我想取消关联RunDetail通过将RunDetails.BatchDetailID设置为null可以从BatchDetail中获取。

这是错误消息:

发生引用完整性约束冲突:关系一端的'BatchDetail.BatchDetailID'的属性值与另一端的'RunDetail.BatchDetailID'的属性值不匹配。

这是我的课程定义:

public class RunDetail
{
    public int RunDetailID { get; set; }
    public Nullable<int> BatchDetailID { get; set; }

    public virtual BatchDetail BatchDetail { get; set; }
}

public class BatchDetail
{
    public int BatchDetailID { get; set; }

    public virtual ICollection<RunDetail> RunDetails { get; set; }
}

当一个RunDetail对象具有一个BatchDetailID值,并且我尝试将其设置回null时,会发生错误

public class MyController : Controller
{
    private ISvr _myService;

    public ISvr MyService
    {
        get { return _myService ?? (_myService = new MyHandler().GetMyService()); }

        set
        {
            _myService = value;
        }
    }

    public void UpdateBatch(int id)
    {
        foreach (var batchDetail in MyService.ReadBatchDetails(id))
        {
            var runDetail = MyService.ReadRunDetail(batchDetail.RunDetailID);

            runDetail.BatchDetailID = null;
            runDetail.BatchDetail = null; // I have tried with, and without, this line

            MyService.UpdateRun(runDetail );
        }
    }
}

public class MyHandler
{
    public ISvr GetMyService()
    {
        return new MySvr();
    }
}

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)]
public class MySvr : IMySvr
{
    public void UpdateRun(RunDetail runDetail)
    {
        using (var myEntities = new MyEntities())
        {
            myEntities.RunDetails.Attach(runDetail); // This is where the exception hits
            myEntities.Entry(runDetail).State = EntityState.Modified;
            myEntities.SaveChanges();
        }
    }
}

所有其他记录更新,包括将外键值更改为另一个,都可以正常工作。

谁能看到我的缺点?

克里斯·希夫豪尔(Chris Schiffhauer)

问题的根源是我未在问题中包括的一种方法。当我检索父BatchDetail记录时,我包括了“ RunDetails”记录:

public List<BatchDetail> ReadBatchDetails(int id)
{
    using (var myEntities = new MyEntities())
    {
        return myEntities.BatchDetails
            .Include("RunDetails") // This is the problem
            .AsNoTracking().ToList();
    }
}

通过创建一个not的新方法Include("RunDetails"),该问题得以解决:

public List<BatchDetail> ReadBatchDetailsWithoutRunDetails(int id)
{
    using (var myEntities = new MyEntities())
    {
        return myEntities.BatchDetails.AsNoTracking().ToList();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在实体框架中将多个外键设置为主键

来自分类Dev

防止实体框架将外键设置为NULL

来自分类Dev

防止实体框架将外键设置为NULL

来自分类Dev

实体框架-未设置外键(0 / null),但导航属性不为null

来自分类Dev

实体框架OneToMany更新项目-缺少外键值

来自分类Dev

首先使用实体框架代码获取外键值

来自分类Dev

实体框架5外键值未更新(VB.NET)

来自分类Dev

首先使用实体框架代码,获取外键值

来自分类Dev

外键值是在OneToMany映射中将值插入为null

来自分类Dev

实体框架的外键

来自分类Dev

实体框架中的一对多关系:为什么外键值为空?

来自分类Dev

实体框架-外键约束

来自分类Dev

外键实体框架6在相关表中插入了null

来自分类Dev

在应用程序设置中将实体框架连接字符串添加为变量

来自分类Dev

无法在实体框架更新方法中将 bool 值设置为 false

来自分类Dev

未设置实体框架ID

来自分类Dev

存储过程的null列在实体框架中将其类型显示为Int

来自分类Dev

实体框架ApplicationUser子实体返回null

来自分类Dev

实体框架外键错误与插入

来自分类Dev

实体框架使用HasOptional加载外键

来自分类Dev

实体框架映射。多个外键

来自分类Dev

实体框架6.1.2中的外键

来自分类Dev

代码优先实体框架和外键

来自分类Dev

实体框架中的两列外键

来自分类Dev

实体框架6添加外键

来自分类Dev

实体框架自动外键填充

来自分类Dev

与实体框架核心的左外连接

来自分类Dev

实体框架不会更新外键对象

来自分类Dev

C#实体框架中的外键