需要实体框架类/数据库架构建议

时间:2011-10-05 15:43:02

标签: c# class schema entity-framework-4.1 ef-code-first

我问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战略。有什么区别?

非常感谢任何建议。

1 个答案:

答案 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负责创建跟踪该关系的表。