即使我指定了自己的ID,实体框架也会自动生成ID

时间:2012-12-05 20:01:26

标签: c# asp.net asp.net-mvc entity-framework

我有一个带有名为Node的表的SQL DB。它有一个组合键:NodeId,DocId。两列都设置为Identity specification = No.我在Visual Studio中生成EDMX以将节点从EF保存到DB。 VS生成的Node对象将两个字段设置为StoreGeneratedPattern = None。我指定的NodeId正确放入DB,但DocId是自动生成的。每次我插入一些新节点时,他们都会获得相同的DocId。这是正确的,但它不是我在对象中指定的DocId。它是一个自动生成的。我指定的NodeId正确保存到数据库 - 该字段不会自动生成。我不认为这两个领域之间存在任何差异。

这是我的代码:

using (MyEntities db = new MyEntities())
{
    // Delete old nodes using my own extension method
    db.DeleteObjects(db.Nodes.Where(n => n.DocId == doc.DocId));

    // Create EF doc object
    Document newDbDoc = docDTO.ToDbDoc();

    // Add new nodes using my own extension method
    db.Nodes.AddObjects(newDbDoc.Nodes);

    try
    {
        db.Connection.Open();

        using (var transaction = db.Connection.BeginTransaction())
        {
            try
            {
                db.SaveChanges();

                transaction.Commit();

                return Json("Success");
            }
            catch
            {
                transaction.Rollback();

                return Json("Error");
            }
        }
    }
    catch
    {
        return Json("Error");
    }
}

我自己的扩展方法:

public static class ObjectContextExtensions
{
    public static void DeleteObjects(this ObjectContext context, IEnumerable<EntityObject> entities)
    {
        foreach (var ent in entities)
        {
            context.DeleteObject(ent);
        }
    }

    public static void AddObjects<TEntity>(this ObjectSet<TEntity> objectSet, IEnumerable<TEntity> entities) where TEntity : class
    {
        foreach (var ent in entities)
        {
            objectSet.AddObject(ent);
        }
    }
}

我做错了什么?

1 个答案:

答案 0 :(得分:1)

Ack ......我发现了发生的事情。每次添加节点时,即使我从未添加调查对象,也会在Document表中创建新的Document。我认为EF足够“聪明”来创建文档本身,因为每个节点都有一个参考调查。我通过仅创建一个节点列表来解决它,该节点列表引用了现有的DocId并且不包括Document对象本身。