我有一个实体(实体框架6),它映射到一个有100列名为col_1,col_2等的表。该表是一个现有的遗留表,用于连接到另一个系统,所以它非常通用,永远不会变化
所以实体有100个属性映射到那些列。
public class DataEntity{
public string Column1{get;set;}
...
}
然后我有这样的数据:
var columnNumber = 1;
var data = "The data";
如何在没有冗长的案例陈述的情况下将col_1设置为“数据”?
var dataEntity = new DataEntity();
这是我不想做的事情:
switch(columnNumber)
{
case 1:
dataEntity.Column1 = data;
break;
}
请注意,无法更改实体的结构。
答案 0 :(得分:2)
如果您绝对无法更改数据结构并且您不想使用switch语句 - 我可能会考虑策略模式的某些实现:
http://www.dofactory.com/net/strategy-design-pattern
如果你不想走那条路,你可以使用反射来设置实体的值,方法是遵循一个约定,其中列总是被命名为#34; col_1"等,但这是非常脆弱。
var myEntity = new MyEntity();
var value = "The data";
var columnNumber = 1;
PropertyInfo propertyInfo = MyEntity.GetType().GetProperty(string.Format("Col_{0}", columnNumber));
propertyInfo.SetValue(myEntity, Convert.ChangeType(value, propertyInfo.PropertyType), null);
答案 1 :(得分:1)
我肯定会使用ExpandoObject将我想要的任何内容推送到虚拟对象中,然后将其映射到类的特定实例...
您可以从此答案中获取映射器代码: https://codereview.stackexchange.com/questions/1002/mapping-expandoobject-to-another-object-type
假设你有一个代表你的神圣母亲的数据库 - 数据库表的类
class LegacyTable
{
public string Column1 { get; set; }
public string Column2 { get; set; }
public string Column3 { get; set; }
// More to come
}
现在,您可以轻松地在动态对象上工作。
dynamic expando = new ExpandoObject();
expando.Column1 = "Data 1";
expando.Column2 = "Data 2";
// Etcetera
您还可以将expando转换为字典以便快速访问(特别是如果您的属性遵循模式“列”+数字
var p = expando as IDictionary<String, object>;
p["Column" + 1] = "Data 1";
p["Column" + 2] = "Data 2";
p["Column" + 3] = "Data 3";
现在,您可以使用映射器将您的道具传递给遗留类的实际实例。
LegacyTable legacy = new LegacyTable();
Mapper<LegacyTable>.Map(expando, legacy);
它只是有效......