【问题标题】:Entity Framework Class / Database Schema advice needed需要实体框架类/数据库模式建议
【发布时间】:2011-10-05 15:43:02
【问题描述】:

我问了question recently,坦率地说,从给出的答案来看,我第二次猜测我的整个策略/我如何设计类和数据库。

我还没有在我的任何实体框架项目中使用 virtual 关键字,也没有使用 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")。我想我明白,如果我要在 person 类上使用 Icollection,我可以改为按照db.person.select(x=> x.notes) 的方式执行一些操作来检索所有笔记。我的这个想法对吗?

如果您在上面相对简单的示例中处于我的位置,您将如何构建类(涉及 ICollection、虚拟或其他)?

此外,最重要的是,上面只是一个示例,但是在我的实际应用中,我使用了一个非常相似的结构,我使用我的自定义类型作为“连接器”/外键。

在我读过的许多例子中,(在上面的例子中)他们会使用public int OwnerID 而不是public person Owner。这真的让我很震惊,我正在质疑我的整个 EF 策略。有什么区别?

任何建议将不胜感激。

【问题讨论】:

  • 是的,与 SQL 相比,EF 是一种范式转变,我会使用最终设计 I gave you 来设计它。

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


【解决方案1】:

我认为您正在使这变得更加困难,这是必要的。如果您正在布置常规类,则可以将它们相互关联,而不是像在示例中那样查找相关的 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 负责创建跟踪该关系的表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2023-03-25
    • 1970-01-01
    • 2023-03-29
    • 2011-05-25
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多