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

此时,Widget表中只存在“Foo”。我使用 SQL Server Profiler 检查进入数据库的数据,并且只为添加了两个的集合中INSERT的第一个发出一个语句。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 回答
0

我不确定,但我认为这是因为 id 中的 virtual 关键字。

你说它首先是代码,数据库中的一个键代表一个不可变的属性。允许覆盖该参数是令人困惑的,并且可能不正确......

子元素的列表也被定义为如下this.Widgets = new HashSet<Widget>();更通用的列表......我会试一试

Ps 我先用过模型

于 2013-08-27T22:40:34.070 回答