0

Nodeというテーブルを持つSQL DBがあります。NodeId、DocId という組み合わせキーがあります。両方の列が Identity specification = No に設定されています。Visual Studio で EDMX を生成し、ノードを EF から DB に保存しました。VS が生成した Node オブジェクトには、StoreGeneratedPattern = None に設定された 2 つのフィールドがあります。指定した NodeId は正しく DB に配置されますが、DocId は自動生成されます。新しいノードを挿入するたびに、それらはすべて同じ DocId を取得します。これは正しいですが、オブジェクトで指定した DocId ではありません。自動生成されたものです。指定した NodeId は DB に正しく保存されます。このフィールドは自動生成されません。2 つのフィールドに違いは見られません。

これが私のコードです:

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

私は何を間違っていますか?

4

1 に答える 1

1

ああ...何が起こっているのかわかりました。ノードを追加するたびに、調査オブジェクトを追加したことがないにもかかわらず、ドキュメント テーブルに新しいドキュメントが作成されました。各ノードが調査への参照を持っているため、EF は Document 自体を作成するのに十分「スマート」であると思います。既存の DocId への参照を持つノードのリストを作成するだけで解決し、Document オブジェクト自体は含めませんでした。

于 2012-12-05T20:42:10.813 に答える