使用实体框架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; }
}
当我尝试添加项目时,看起来我总是需要确保类别为null。如果我忘记将其设置为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进入和编辑导航属性的主要内容,如果未能解决你的问题,请参考以下文章
实体框架 6:将子对象添加到父列表与将子对象的导航属性设置为父对象