.NET EF4在保存时复制实体

时间:2011-08-02 08:39:51

标签: .net asp.net-mvc-3 entity-framework-4

我正在使用MVC3& EF4,在尝试使用外键关系保存实体时遇到了一些问题。

这是我的模型(缩短以节省空间)

public class MenuItem
{
    /// <summary>
    /// The ID
    /// </summary>
    [Key]
    public int MenuItemID { get; set; }

    /// <summary>
    /// Foreign key to menu item category
    /// </summary>
    public int MenuItemCategoryID { get; set; }

    /// <summary>
    /// The item category
    /// </summary>
    public MenuItemCategory MenuItemCategory { get; set; }
}

public class MenuItemCategory
{
    /// <summary>
    /// The ID
    /// </summary>
    [Key]
    public int MenuItemCategoryID { get; set; }

    /// <summary>
    /// The name
    /// </summary>
    [Required]
    [DataType(DataType.Text), StringLength(128)]
    public string Name { get; set; }
}

然后我在我的存储库中有这个方法,它保存了MenuItems:

public void CreateMenuItem(MenuItem menuItem)
{
    MissChuDataContext.MenuItems.Add(menuItem);
    MissChuDataContext.SaveChanges();
}

我的数据库映射是:

modelBuilder.Entity<MenuItem>().HasRequired(x => x.MenuItemCategory).WithMany().HasForeignKey(x => x.MenuItemCategoryID);

但是出于某种原因,repo方法在保存与现有MenuItemCategory相关的新MenuItem时会创建重复的MenuItemCategory实体。

我已经设法通过从控制器中的上下文重新分配MenuItemCategory来使其工作:

[HttpPost]
public ActionResult CreateMenuItem(MenuItem menuItem)
{
    menuItem.MenuItemCategory = MenuItemRepository.GetMenuItemCategoryByID(menuItem.MenuItemCategory.MenuItemCategoryID);
    MenuItemRepository.CreateMenuItem(menuItem);

    return View();
}

这样做并且不会创建一个重复的MenuItemCategory,但是我确定我错过了一些简单的东西,这会阻止复制,而且我不必在控制器中使用menuItem.MenuItemCategory = ...调用。 / p>

无处不在,但到目前为止找不到任何有用的东西:(

非常感谢!

1 个答案:

答案 0 :(得分:0)

试试这个:

public void CreateMenuItem(MenuItem menuItem)
{
    MissChuDataContext.MenuItems.Add(menuItem);
    MissChuDataContext.Entry(menuItem.MenuItemCategory).State = EnttiyState.Unchanged;
    MissChuDataContext.SaveChanges();
}

问题在于,当您调用Add时,EF会在对象图中添加所有实体,而不仅仅是menuItem。在进行任何更改之前,如果未通过相同的上下文实例加载它们,则必须始终手动处理附加或添加到上下文的所有实体的状态。