实体框架POCO与域对象不匹配

时间:2009-11-03 03:09:07

标签: entity-framework orm domain-driven-design

我为我正在进行的项目采用了模型第一种方法。类关系的一个例子如下所示,非常明确:

public class Product
{
  public int Id { get; set; }
  public string Name { get; set; }
  List<Photo> Photos { get; set; }
}

public class Photo
{
  public int Id { get; set; }
  public string Path { get; set; }
}

数据库架构大致为:

--------------
Products Table
--------------
Id int,
Name Varchar

------------
Photos Table
------------
Id int,
Path varchar
ProductId int FK Products.ID 

产品可以有零个或多个照片。

现在,当我尝试插入是我的首选ORM(实体框架V4 - Poco方法)时,我不得不在域模型中映射我的关系!

public class Product
{
  public int Id { get; set; }
  public string Name { get; set; }
  List<Photo> Photos { get; set; }
}

public class Photo
{
  public int Id { get; set; }
  public string Path { get; set; }
  public int ProductId {get; set; } //Foriegn Key
  public Product Proudct {get; set; } //For uni-directional navigation

}

首先,我不需要/想要单向导航。我明白这可以删除。其次,我不希望在Photos类中声明Foriegn Key。

如果我必须在域对象中定义数据库属性,我不认为这是真正的POCO /持久性无知吗?

其他ORM的行为是这样的吗?

3 个答案:

答案 0 :(得分:1)

我找到了答案。使用该向导,可以选择“在模型中包含外键列” - 取消选中此框,您将获得一个没有FK的干净概念模型。

确保在属性窗口中将代码生成策略设置为none。

答案 1 :(得分:0)

为什么不想拥有 Photo.Product 属性?如果没有这样的属性,似乎一张照片可以属于多个产品,因为数据库模式应该更复杂(使用辅助表)。

答案 2 :(得分:0)

关系不必是双向的,也不必是公开的(如果使用真正的POCO,而不是代理类型)。您已经对代码中想要的东西说了很多,但是您可以更清楚地了解 想要如何定义关系吗?它必须去某个地方。你想把它放在哪里?有很多选择。