繁体   English   中英

EF4.1代码首先添加具有相关实体的实体

[英]EF4.1 Code First Add Entity with Related Entity

我正在使用EF4.1代码优先。 我无法获得非常简单的插入内容来保存相关的实体ID。 生成的SQL始终为任何相关实体插入NULL。 示例代码如下。 有人可以在这里看到我在做什么错吗? 它确实可以正确插入非实体属性,例如字符串。 另外,在数据库初始化程序类中,我也有类似的代码可以播种测试数据,而且看起来工作正常。

        using (var ctx = new DataContext())
        {
            ctx.Users.Attach(existingUser);

            // create item and add to context
            var newItem = new MyItem();
            ctx.MyItems.Add(newItem);

            // set related entity
            newItem.CreatedBy = existingUser;

            ctx.SaveChanges();
        }

您的代码应与DbContext默认配置DbContext 一种不起作用的可能解释是您禁用了自动更改检测,例如,如果您的上下文的构造函数中有以下内容:

public DataContext()
{
    this.Configuration.AutoDetectChangesEnabled = false;
}

在这种情况下,将新项目添加到上下文后,EF将无法检测到导航属性newItem.CreatedBy的更改。 (如果未禁用更改检测,则SaveChanges将检测到此最后更改。)

您可以更改代码,以便在将新项添加到上下文之前进行导航属性的设置:

using (var ctx = new DataContext())
{
    ctx.Users.Attach(existingUser);

    // create item and add to context
    var newItem = new MyItem();

    // set related entity
    newItem.CreatedBy = existingUser;

    ctx.MyItems.Add(newItem);

    ctx.SaveChanges();
}

无论有没有自动更改检测,这都可以工作。

尝试这个:

using (var ctx = new DataContext())
{
    ctx.Users.Attach(existingUser);

    // create item and add to context
    var newItem = new MyItem();
    ctx.MyItems.Add(newItem);

    // set related entity
    newItem.CreatedBy = existingUser;

    // Added
    ctx.ObjectStateManager.ChangeObjectState(newItem.CreatedBy, EntityState.Added);

    ctx.SaveChanges();
}

如果这不起作用,请使用以下命令更改行:

ctx.ObjectStateManager.ChangeObjectState(newItem.CreatedBy,EntityState.Modified);

添加了1行...希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM