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

时间:2011-08-08 22:52:29

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

我正在使用EF4.1 Code First。我无法获得一个非常简单的插入来保存相关的实体ID。生成的SQL总是为任何相关实体插入NULL。示例代码如下。谁能看到我在这里做错了什么?它确实正确插入非实体属性,例如字符串。此外,我在DB初始化程序类中有类似的代码来播种测试数据,它似乎工作正常。

        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();
        }

2 个答案:

答案 0 :(得分:1)

您的代码应该使用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();
}

无论是否有自动更改检测,都可以使用。

答案 1 :(得分:0)

试试这个:

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);

添加了一行...希望它有所帮助。