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

时间:2018-01-03 05:51:44

标签: entity-framework entity-framework-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();
}

此代码将导致另一个具有重复名称的新类别&#34; pet&#34;创建。我想这很有道理。但我想知道是否有关于如何/何时设置为集合对象(类别对象)的指南,或何时应将其设置为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中有更好的形成?

1 个答案:

答案 0 :(得分:0)

将项目类更改为此

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,
};