gpt4 book ai didi

c# - Entity Framework 5 如何在存在关系时执行创建/更新

转载 作者:行者123 更新时间:2023-11-30 15:31:34 24 4
gpt4 key购买 nike

假设我有两个实体:

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 在这种情况下究竟如何工作?我应该如何进行才能在 MenuSubMenu 中创建记录?

  • 为现有菜单创建子菜单

让我感到困惑的第二种情况是,当我必须创建新记录时,我应该将其与现有的 Menu 相关联。我的代码再次看起来像这样:

SubMenu subMenu = new SubMenu();
subMenu.Name = model.sub.Name;
subMenu.Image = model.sub.Image;
subMenu.Menu = //hmm?
subMenu.MenuID = //hmm?

在这种情况下,我有一个现有的 Menu,因此我可以获得两者 - 此 SubMenu 的确切 Menu 实体或只是 菜单编号。当我查看 subMenu 实体时,如果我传递整个 Menu 对象,例如:

subMenu.Menu = menu //here menu is instance of 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com