实体框架和POCO

时间:2012-02-17 02:37:38

标签: entity-framework-4.1 poco

我正在学习实体框架和POCO,虽然我喜欢很多概念,但我认为我并没有完全理解它。这是一个例子:

我有以下架构:

create table Customer
{
  Id int,
  Name varchar(32),
  Value1 varchar(32),
  Value2 varchar(32),
  Value3 varchar(32)
  ...
  Value50 varchar(32)
}

-- ColumnName will map to "Value1", "Value2", etc
create table ColumnMapping
{
  ColumnName varchar(32),
  DisplayName varchar(32) 
}

表示此数据的对象如下所示:

class Customer
{
    public Id { get; set; }
    public Name { get; set;}
    public Dictionary<string, string> CustomData { get; set; }
}  

也就是说,我想将Value1映射到Value50到Dictionary(其中字典的Key由ColumnMapping表确定)。

我想知道最好的办法是什么。

我希望客户成为POCO,但为了做到这一点,需要了解Value1..Value50,以便能够将这些列转换为字典。但鉴于POCO应该持续无知,我质疑这是否是正确的方法。

我想,总的来说,我正在努力解决POCO的真正含义 - 它是业务层使用的对象,还是需要在POCO和“业务对象”之间进行映射, “业务对象”是业务层应该使用的内容。

有关如何处理此类情景的任何建议将不胜感激。

修改

由于我没有收到我试图提出的问题的答案,我会继续说明我的决定(如果有人有类似的问题)。虽然POCO持续无知,因为它不需要知道它是如何被持久化的,但它并不是完全持久的无知。也就是说,它必须以某种方式绑定到持久层。

在我的示例中,虽然我不希望业务层知道Value1,Value2,Value3等,但有人需要了解它才能将这些值转换为字典。我认为放置逻辑的正确位置是POCO,因此,我认为POCO应该具有Value1,Value2,Value3等列的属性。

谢谢, 埃里克

1 个答案:

答案 0 :(得分:1)

在ORM世界中,这是典型的方法

class Customer
{
   public int Id { get; set; }
   public string Name {get; set; }
   public virtual ICollection<CustomDatum> CustomData { get; set; }
}

class CustomDatum
{
   public int Id { get; set; }   // PK
   public string ColomnName { get; set; }
   public string DisplayName { get; set; }
}