2012-02-17 181 views
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; } 
} 

也就是说,我想映射值1将Value50设置为Dictionary(字典的关键字由ColumnMapping表确定)。

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

我希望客户成为POCO,但为了做到这一点,它需要了解Value1..Value50,以便它能够将这些列转换为字典。但考虑到POCO应该持续无知,我在质疑这是否是正确的方法。我想,一般来说,我正在为POCO的真正目标而努力 - 它是业务层使用的对象,还是需要在POCO和“业务对象”之间进行映射,以及“业务对象”是业务层应该使用的。

任何有关如何处理这种情况的建议将不胜感激。

编辑

,因为我没有得到一个答案,我想请问一下,我会继续前进,并指示我决定的问题(如果任何人有这种类似的问题)。虽然POCO持续不知情,因为它不需要知道它如何持续下去,但它并不完全是无知的。也就是说,它必须以某种方式与持久层绑定。

在我的示例中,尽管我不希望业务层了解Value1,Value2,Value3等,但有人需要知道它以便将这些值转换为字典。我认为把这个逻辑放在正确的地方是POCO,因此我认为POCO应该具有Value1,Value2,Value3等列的属性。

感谢, 埃里克

回答

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; } 
} 
+0

感谢雷。我认为你建议我应该使用不同的模式。虽然你对某些应用程序可能会更好,但我们假设对于这个问题我需要具有上述模式。通过我提到的模式,我想知道POCO对象应该是什么样子,以及在业务层中是否有不同的(但相似的)对象。 – Eric 2012-02-17 06:27:06