首页 > 解决方案 > 导致 object.child = null 对象失败的动态代理?

问题描述

我注意到一些我无法解释的奇怪行为,可能与动态代理有关,因为我无法通过简单的对象实例化重新创建它,但更奇怪的是?我试图用来绕过它的操作符行为。

我有两个简单的对象:

public class Parent
{
    public int Id { get; set; }
    public virtual Child Child { get; set; }
    public string Name { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我使用一种方法找到一个Parent对象,DbContext例如

Parent parentToUpdate = _context.Parent.Find(1);

这个对象已经配备了一个填充的孩子,比如 ID 22,生成为System.Data.Entity.DynamicProxy

然后我有一个新的子对象,它变为空,因为在数据库中找不到它,使用相同的 DbContext:

Child newChild = _context.Child.Find(999); // returns null

然后我尝试用对象覆盖parentToUpdate对象的子newChild对象:

parentToUpdate.Child = newChild;

这间歇性地不起作用 -parentToUpdate.Child不会变为空。

问题 1 - 为什么这不起作用? 我很确定这与动态代理有关。

然后我想好吧,我会先检查一个空值:

if(newChild == null)
{
    parentToUpdate.Child = null;
}
else
{
    parentToUpdate.Child = newChild;
}

这种if else格式总是有效的。

但实际上我只是这样尝试过,因为在此之前,我以简洁的方式尝试过,使用?

parentToUpdate.Child = newChild == null ? null : newChild;

而这通常也不起作用。

问题 2 这个语句怎么会失败?它既没有赋值null也没有newChild对象(这也是空的!) - 这个语句基本上不是一个if else语句吗?

我在调试配置中进行测试时注意到了这一点,但实际上单步执行代码似乎这种行为发生的频率要低一些。

这里发生了什么?

标签: c#entity-framework

解决方案


推荐阅读