使用实体框架6进入和编辑导航属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用实体框架6进入和编辑导航属性相关的知识,希望对你有一定的参考价值。

这可能是一个重复的问题,但我找不到确切的答案或文档。

我有两张桌子,有一对多的关系。每个项目都有一个类别,CategoryID是外键。

public partial class Item
{
    public long ItemID { get; set; }
    public string ItemName { get; set; }
    public int CategoryID { get; set; }

    public virtual Category Category { get; set; }
}

public partial class Category
{
    public int CategoryID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Item> Items { get; set; }
}

当我尝试添加项目时,看起来我总是需要确保类别为nu​​ll。如果我忘记将其设置为null,EntityFrame将创建一个新类别,即使存在旧的类别。

例如:我的数据库是:

Item
Item #1: id: 1, name TV categoryId : 1
Item #2: id: 2, name DVD categoryId : 1
Item #3: id: 3, name Cat categoryId: 2

Categories
Category #1: id: 1 name: electronics
Category #2: id: 2 name: pets.

如果我的代码是

using (var dbContext = new DBContext())
{
    Category category = dbContext.Categories.FirstOrDefault(c=>c.CategoryID = 2);
    Item item = new Item()
    {
        Name = "dog",
        CategoryId = 2,
        Category = category,
    };

    dbContext.Items.Add(item);
    dbContext.SaveChanges();
}

此代码将导致另一个新类别创建重复名称“pet”。我想这很有道理。但我想知道是否有关于如何/何时设置为集合对象(类别对象)的指南,或何时应将其设置为null?当我需要更新现有项目的类别时,SOP是什么?如果我只使用以下代码:

using (var dbContext = new DBContext())
{
    Item item = dbContext.Items.FirstOrDefault(i => i.ItemID == 1);
    item.CategoryId = 2;
    dbContext.SaveChanges();
}

此代码无效。我应该手动将item.Category属性设置为null吗?或者EF6有更好的阵型?

答案

将Item Class更改为此

public partial class Item
{
    public long ItemID { get; set; }
    public string ItemName { get; set; }
    public int CategoryID { get; set; }

    [ForeignKey="CategoryID"]
    public virtual Category Category { get; set; }
}

然后你在类中使用[ForeignKey]注释将id连接到数据,当你创建新数据时,只需将类别ID放入数据。

Item item = new Item()
{
    Name = "dog",
    CategoryID = 2,
};

以上是关于使用实体框架6进入和编辑导航属性的主要内容,如果未能解决你的问题,请参考以下文章

如何首先使用实体​​框架 5 代码删除具有导航属性的对象?

实体框架 6:将子对象添加到父列表与将子对象的导航属性设置为父对象

实体框架 CTP5,代码优先。可选的导航属性

如何使用代码优先实体框架在 ASP.Net MVC3 中重新加载多对多导航属性

在导航属性实体框架上正确使用接口

实体框架代码优先导航问题