我正在学习实体框架和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等列的属性。
谢谢, 埃里克
答案 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; }
}