是否可以在POCO类上使用构造函数或其他非数据库访问方法。例如,将视图模型传递给控制器时。
控制器:
public ActionResult SomeMethod(SomeViewModel model)
{
var entity = new SomePocoClasse(model);
// ... then save entity to database
return SomeActionResult
}
实体:
public SomeClass() {}
public SomeClass(SomeViewModel model)
{
// create itself based on values in model
}
public void Update(SomeViewModel model)
{
// Update itself base on values in model
}
第一个实体构造函数用于实体框架或常规创建
var entity = new entity
{
// set up properties
};
第二个是从SomeViewModel
创建var entity = new entity(SomeViewModel);
该方法用于从SomeViewModel
更新自身var entity = SomeIRepository.Get(id);
entity.Update(SomeViewModel);
或者上述不良做法应该去其他地方。
答案 0 :(得分:2)
是和否。一般来说,在POCO上使用构造函数并不一定是不好的做法。您可能想要或需要的原因有很多。但是,您需要确保维护无参数构造函数,否则您将导致EF等问题无法正确初始化POCO类。
那就是说,你在这里做的是不是良好做法。您还没有提供大量代码,但看起来您正在做的是将视图模型传递给POCO构造函数,以使用这些值设置POCO上的属性。相反,您应该做的是从数据库中提取实体,然后将视图模型上的任何相关属性映射到该实体实例。我认为你所做的事情在创建一个新实体时可能会很好,但这意味着有两种不同的方法可以根据你是创建还是编辑来填充POCO类的值。这增加了复杂性和复杂性意味着更高的维护成本。
相反,您应该使用像AutoMapper这样的库,或者创建一个实用程序类来处理映射:
public static class SomePocoMapper
{
public static SomePoco Map(SomeViewModel model)
{
return Map(model, null);
}
public static SomePoco Map(SomeViewModel model, SomePoco entity)
{
entity = entity ?? new SomePoco();
// map over property values;
return entity;
}
}
然后在你的创作中:
var entity = SomePocoMapper.Map(model);
在您的编辑操作中:
var entity = // get entity from database
SomePocoMapper.Map(model, entity);