假设我有两个实体:

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 的新 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 ,所以我可以同时获得 - Menu 的精确 SubMenu 实体或 MenuId 。当我查看 subMenu 实体时,如果我传递整个 Menu 对象,例如:



    我可以看到现在 subMenu.Menu 保存了对象的所有属性,包括 MenuId 我是否需要提供它 - subMenu.MenuId = menu.MenuIdEF 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/

    10-13 06:20