4

次の構造を持つ Code First EF 5.0 モデルがあります。

public class Widget 
{
    public virtual Int32 Id { get; set; }
    public virtual String Name { get; set; }
}

public class Product
{
    public virtual Int32 Id { get; set; }
    public virtual ICollection<Widget> Widgets { get; set; }
    public virtual AddWidget(Widget widget)
    {
        Guard.NotNull(widget);

        if (Widgets == null)
        {
            Widgets = new List<Widget>();
        }

        Widgets.Add(widget);
    }
}

Product複数の追加された新しいトランジェントを保存しようとするとWidget、最初にWidget追加されたものだけが保存されます。

// ProductManagementContext is a DbContext
// ProductManagementContext.Products is a DbSet<Product>
using(var context = new ProductManagementContext())  
{
    var product = new Product();
    product.AddWidget(new Widget() { Name = "Foo" } );
    product.AddWidget(new Widget() { Name = "Bar" } );
    context.Products.Add(product);
    context.SaveChanges();
}

この時点で、テーブルには「Foo」のみが存在しWidgetます。SQL Server Profiler を使用して、データベースに送られるデータを確認しましたが、2 つ追加されたコレクションINSERTの最初のステートメントに対して 1 つのステートメントのみが発行されます。Widget

EF が両方の新しいエンティティでカスケードしないのはなぜですか?

4

2 に答える 2

1

あなたの問題は、指定されたコードでは再現できません。私はそれをたくさんコピーして貼り付け、コンパイルの問題を修正し(AddWidgetには戻り値の型が必要です)、への呼び出しを削除してGuard実行し、両方のウィジェットがデータベースに表示されるのを確認しました。

これが完全なコードです。うまくいけば、コードがどこで異なるかを見つけることができます。

using System;
using System.Collections.Generic;
using System.Data.Entity;

namespace EF_SO_Q
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new ProductManagementContext())
            {
                var product = new Product();
                product.AddWidget(new Widget() { Name = "Foo" });
                product.AddWidget(new Widget() { Name = "Bar" });
                context.Products.Add(product);
                context.SaveChanges();
            }
        }
    }

    public class Widget
    {
        public virtual Int32 Id { get; set; }
        public virtual String Name { get; set; }
    }

    public class Product
    {
        public virtual Int32 Id { get; set; }
        public virtual ICollection<Widget> Widgets { get; set; }
        public virtual void AddWidget(Widget widget)
        {

            if (Widgets == null)
            {
                Widgets = new List<Widget>();
            }

            Widgets.Add(widget);
        }
    }

    public class ProductManagementContext : DbContext
    {
        public DbSet<Widget> Widgets { get; set; }
        public DbSet<Product> Products { get; set; }
    }
}
于 2013-08-27T23:15:27.693 に答える