为什么我的EF4.1关系在赋值空值时没有设置为null?

时间:2011-04-23 14:30:49

标签: c# entity-framework entity-framework-4.1 ef-code-first

在我的系统中,我有任务,可以选择分配给联系人。所以在我的业务逻辑中,我有以下代码:

 if (_contactChanged) { task.Contact = contact; }

如果未指定联系人,则contact变量为空。当我提交更改时,这是假设以使联系人关系无效,但是我注意到99%的时间我没有发生这种情况(我已经看到它发生过一次,但不是一直发生的)一遍又一遍地踩过这段代码。)

当我调试时,我已经验证_contactChangedtrue并且内部代码没有被点击。但是,在我单步执行task.Contact = contact;后,我注意到contact为空,task.Contact的类型为

{System.Data.Entity.DynamicProxies
.Contact_4DF70AA1AA8A6A94E9377F65D7B1DD3A837851FD3442862716FA7E966FFCBAB9}

并且仍然保留了以前的数据。

为什么代理没有设置为null,我怎样才能让它正常工作?

1 个答案:

答案 0 :(得分:9)

哇。好问题。即使指示对象不是动态代理,我也可以确认/重现此t.Contact = null;不起作用!

到目前为止,我得到的最佳答案是:

    context.Entry(task).Reference(t => t.Contact).CurrentValue = null;

我真的希望有一种比这更好的方法,因为这是一种非常不方便的语法。

<强>更新

这有效:

    var task = context.Tasks
        .Where(...your condition here...)
        .Include(t => t.Contact)
        .First();

    task.Contact = null;

或,

如果您的模型中定义了外键ID(如可以为空的ContactId),那么这将变得更加容易。