使用实体框架映射组合关系的问题

时间:2009-11-05 10:10:52

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

我正在尝试使用实体框架对我的域模型进行建模。一个例子是包含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类上。典型的封装工作在这里。

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

1 个答案:

答案 0 :(得分:0)

您的(概念)实体应该与数据库架构非常匹配,然后项目到您的Content类:

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.
                                     }
                       }
         };

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