我问question recently,坦率地说,从给出的答案中,我是第二个猜测我的整个策略/如何设计类和数据库。
我还没有在我的任何Entity Framework项目中使用虚拟关键字,也没有使用Icollection,坦率地说,在reading about it in部分示例之后,我并不完全理解为什么需要它,或者如何它有效。
在示例应用程序中,我有一个简单的设计,其中有三个列表 - 人物,笔记和图片。这种关系是这样的,一个人可以拥有多个笔记和图片,以及拥有徽标即图片的人。
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; }
}
当我想选择一个人拥有的笔记列表时,我只需在笔记对象上执行db.Notes.Where(x=>x.owner=="y")
。我想我明白,如果我在人类课堂上使用Icollection,我可以执行db.person.select(x=> x.notes)
的某些操作来检索所有笔记。我这个想法是否正确?
如果您使用上面相对简单的示例处于我的位置,您将如何构建类(涉及ICollection,虚拟或其他任何东西)?
此外,最重要的是,上面只是一个例子,但在我的实际应用中,我使用了一个非常相似的结构,我使用自定义类型作为“连接器”/外键。
在我阅读的许多示例中,(在上面的示例中)他们将使用public int OwnerID
而不是public person Owner
。这真的让我感到震惊,我正在质疑我的整个EF战略。有什么区别?
非常感谢任何建议。
答案 0 :(得分:0)
我认为你正在努力使这更加困难。如果你正在布置常规课程,你会将它们彼此联系起来,而不是找到相关的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; }
}
现在说你已经使用查询获得了你的人物对象
var person = _context.People.Where(m=>m.ID=randomIntWeWant).First();
我们可以将所有相关项目作为属性。
对于笔记
person.Notes
对于照片
person.Photos
ICollection与延迟加载有关。通过在一侧将属性声明为ICollection,您可以说对象之间存在多对一关系。如果您将属性声明为双方的ICollection,则表示它是多对多关系。 EF负责创建跟踪该关系的表。