需要实体框架类/数据库架构建议
本文关键字:数据库 构建 实体 框架 | 更新日期: 2023-09-27 18:10:34
我最近问了一个问题,坦率地说,从给出的答案来看,我正在重新考虑我的整个策略/我如何设计类和数据库。
我还没有在我的任何实体框架项目中使用过虚拟关键字,也没有使用过Icollection,而且坦率地说,在阅读了一些示例之后,我不完全理解为什么需要它,或者它是如何工作的。
在一个示例应用程序中,我有一个简单的设计,其中有三个列表-人,笔记和图片。这种关系是这样的,一个人可以拥有多个笔记和图片,以及一个人的标志是一个图片。 public class Person
{
public int ID { get; set; }
public string name { get; set; }
public Picture logo { get; set; }
}
public class Note
{
public int ID { get; set; }
public string Text { get; set; }
public Person Owner { get; set; }
}
public class Picture
{
public int ID { get; set; }
public string Path { get; set; }
public Person Owner { get; set; }
}
当我想要选择一个人拥有的笔记列表时,我只需在notes对象上执行db.Notes.Where(x=>x.owner=="y")
。我想我明白,如果我要在person类上使用iccollection,我可以按照db.person.select(x=> x.notes)
的行来执行一些操作来检索所有的笔记。我这样想对吗?
如果你在我的位置与上面的相对简单的例子,你会如何构建类(涉及到ICollection, virtual或其他)?
此外,最重要的是,上面只是一个例子,但是在我的实际应用程序中,我使用了一个非常相似的结构,其中我使用自定义类型作为"连接器"/外键。
在我读过的许多例子中,(在上面的例子中)他们将使用public int OwnerID
而不是public person Owner
。这真的让我很困惑,我开始质疑我的整个EF战略。有什么不同?
我认为你让这件事变得更困难了。如果你在布置常规的类,你应该把它们彼此关联起来,而不是像你在例子中那样找到相关的id并分别加载它们。
public class Person
{
public int ID { get; set; }
public string name { get; set; }
public ICollection<Note> Notes { get; set; }
public ICollection<Picture> Pictures { get; set; }
public Picture logo { get; set; }
}
public class Note
{
public int ID { get; set; }
public string Text { get; set; }
public Person Owner { get; set; }
}
public class Picture
{
public int ID { get; set; }
public string Path { get; set; }
public Person Owner { get; set; }
}
现在假设你使用查询
获得了person对象var person = _context.People.Where(m=>m.ID=randomIntWeWant).First();
我们可以获得所有相关的项目作为属性。
指出person.Notes
照片person.Photos
ICollection与延迟加载有关。通过在一侧将属性声明为ICollection,您可以说对象之间具有多对一关系。如果你在两边都声明一个属性为ICollection,你就是在说它是一个多对多关系。EF负责创建跟踪这种关系的表。