【问题标题】:Problems Mapping Composition Relationships using Entity Framework使用实体框架映射组合关系的问题
【发布时间】:2010-12-13 08:49:54
【问题描述】:

我正在尝试使用实体框架为我的域模型建模。一个示例是包含 Content 类的 Page 类。

public class Page
{
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
   public virtual Content PageContent { get; set; }
}

public class Content 
{
   public IList<Version> Versions { get; private set; }


   public Version GetLatestPublishedVersion()
   {
       //Some biz logic to get the latest published version
   }


   public Version GetLatestDraftVersion()
   {
     //Some biz logic to get the latest draft version
   }

   public void AddVersion() {}

   public void DeleteVersion() {}
  ....

}

数据库模型没有Content的表,实际上表关系是:

Pages Table
----------
Id
Name


Versions Table
--------------
Id
PageId FK PAGES.ID
Title
Body

如何在概念模型中为 Content 类建模? 我尝试使用复杂类型,但它只包含标量属性。尝试使用实体类型,但我收到一条消息,基本上说在数据库中为 Content 类设置一个表,为什么?

我不觉得域模型是错误的,它是这样设计的,所以发布问题不在 Page 类上。典型的封装在这里工作。

还有其他人遇到过这个问题吗?

【问题讨论】:

    标签: design-patterns entity-framework database-design orm


    【解决方案1】:

    您的(概念)实体应该与数据库架构非常匹配,然后您投影到您的内容类:

    var q = from p in Context.PageEntities  // PageEntity is different than Page
            where p.id == id
            select new Page
            {
                Id = p.Id,
                Name = p.Name,
                Content = new Content 
                          {
                              Versions = from v in p.Versions
                                         select new Version
                                         {
                                             Id = v.Id,
                                             Body = v.Body, // etc.
                                         }
                           }
             };
    

    这可以让您的数据模型和发布模型独立发展。您只需更改投影即可。

    【讨论】:

    • 为什么概念实体需要与数据库模式紧密匹配?将概念模型和物理模型分开的意义在于,物理模型可以非常不同,以满足底层商店的性能和空间需求。
    • 与其说它必须与数据库模式匹配,不如说它应该与数据库模式比表示模型更紧密地对齐。如果您的 EF 模型取决于您的数据库架构,那也没关系。如果您的 EF 模型依赖于您的 Web 视图,那就不行了。
    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多