我正在使用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>
无处不在,但到目前为止找不到任何有用的东西:(
非常感谢!
答案 0 :(得分:0)
试试这个:
public void CreateMenuItem(MenuItem menuItem)
{
MissChuDataContext.MenuItems.Add(menuItem);
MissChuDataContext.Entry(menuItem.MenuItemCategory).State = EnttiyState.Unchanged;
MissChuDataContext.SaveChanges();
}
问题在于,当您调用Add
时,EF会在对象图中添加所有实体,而不仅仅是menuItem。在进行任何更改之前,如果未通过相同的上下文实例加载它们,则必须始终手动处理附加或添加到上下文的所有实体的状态。