假设我有两个实体:
public class Menu
{
//other properties..
public virtual ICollection<SubMenu> SubMenus { get; set; }
}
和第二个实体:
public class SubMenu
{
//other properties..
public int MenuID { get; set; }
public virtual Menu Menu { get; set; }
}
EF 5
如何跟踪实体之间的关系以及我需要传递什么才能执行创建/更新操作?有几个示例场景,我不太确定我需要什么以及我不需要什么需要作为值传递,以便为
EF 5
提供足够的信息来完成任务。例如:
假设我已经提交了包含
Menu
的新 SubMenu
数据的表单,我想将其保存到我的数据库中。我的代码将类似于:Menu menu = new Menu();
menu.Name = model.Name;
menu.Description = model.Description;
//and so on..
然后对于子菜单,我会有类似的东西:
SubMenu subMenu = new SubMenu();
subMenu.Name = model.sub.Name;
subMenu.Image = model.sub.Image;
subMenu.Menu = //The menu does not exist yet...
subMenu.MenuID = //I don't have Menu so no ID either
在这种情况下,
EF 5
究竟是如何工作的?我应该如何继续以在 Menu
和 SubMenu
中创建记录?使我感到困惑的第二个场景是当我必须创建新记录时,我应该将其与现有的
Menu
相关联。同样,我的代码看起来像这样:SubMenu subMenu = new SubMenu();
subMenu.Name = model.sub.Name;
subMenu.Image = model.sub.Image;
subMenu.Menu = //hmm?
subMenu.MenuID = //hmm?
在这种情况下,我有一个现有的
Menu
,所以我可以同时获得 - Menu
的精确 SubMenu
实体或 MenuId
。当我查看 subMenu
实体时,如果我传递整个 Menu
对象,例如:我可以看到现在
subMenu.Menu
保存了对象的所有属性,包括 MenuId
我是否需要提供它 - subMenu.MenuId = menu.MenuId
? EF 5
如何建立关系,我到底需要提供什么? 最佳答案
同时创建Menu和SubMenu,需要实现空对象模式(在Menu类的ctor中初始化SubMenu)
public class Menu
{
public int Id { set; get; }
public string Name { set; get; }
public string Description { set; get; }
public virtual ICollection<SubMenu> SubMenus { get; set; }
public Menu()
{
SubMenus = new List<SubMenu>();
}
}
然后你可以使用
SubMenus.Add
方法添加子菜单 using (var context = new MyContext())
{
Menu menuItem1 = new Menu();
menuItem1.Name = "modelName";
menuItem1.Description = "modelDescription";
SubMenu subMenu1 = new SubMenu();
subMenu1.Name = "subName1";
menuItem1.SubMenus.Add(subMenu1); // how to define sum-menus (SubMenus is not null anymore)
context.Menus.Add(menuItem1);
context.SaveChanges();
}
现在 EF 会自动运行这些查询。它插入根项,然后将其 Id 用于子项:
INSERT [dbo].[Menus]([Name], [Description])
VALUES (@0, @1)
SELECT [Id]
FROM [dbo].[Menus]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
-- @0: 'modelName' (Type = String, Size = -1)
-- @1: 'modelDescription' (Type = String, Size = -1)
-- Executing at 2013/12/11 02:27:50 ?.? +03:30
-- Completed in 43 ms with result: SqlDataReader
INSERT [dbo].[SubMenus]([Name], [MenuID])
VALUES (@0, @1)
SELECT [Id]
FROM [dbo].[SubMenus]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
-- @0: 'subName1' (Type = String, Size = -1)
-- @1: '1' (Type = Int32)
-- Executing at 2013/12/11 02:27:50 ?.? +03:30
-- Completed in 26 ms with result: SqlDataReader
创建一个新的子菜单并将其与现有菜单相关联,与以前相同。使用
existingMenuItem.SubMenus.Add(newSubMenuItem);
using (var context = new MyContext())
{
var existingMenuItem = context.Menus.Find(1);
SubMenu newSubMenu = new SubMenu();
newSubMenu.Name = "subName2";
existingMenuItem.SubMenus.Add(newSubMenu); // how to define sum-menus
context.SaveChanges();
}
关于c# - 存在关系时 Entity Framework 5 如何执行创建/更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20459534/