我正在尝试使用MVC 2,ADO.NET EF和POCO。我使用POCO生成器在一个单独的库中生成了我的实体类。这些POCO实体用作ViewPages(不确定这是设计的正确方法还是需要单独的ViewModels类?)
现在,如果我举一个简单的场景,我需要添加一个Employee对象(与Department Master相关),那么应该建议在层之间传递这些对象的方法。
应用程序的分层结构有点像这样:
我想到了各种替代方案:
我在Employee Controller中有一个名为 AddEmployee()的方法,它接受FormCollection作为参数。在表格集合中,我会发布员工姓名,年龄,薪资等数据以及所选部门的ID。
1。)一种方法是我可以创建另一个DTO说EmployeeDepartment DTO,它将用于按原样映射FormCollection中的值。然后,我可以在管理器层断开它们并使用它们来创建实体对象,即Employee Object,并按类似于此的查询引用部门:
e.Department = Department.where(i => i.deptId == empDepDto.dept_id).first()
我不喜欢这个,并且觉得每次涉及到关系时我都要添加一个DTO,然后将它映射到我的实体类。
2。)第二个可能是最差的,即将每个对象作为参数传递,然后将它们连接在管理器层中。
3。)按原样使用POCO,在控制器层创建一个Employee对象和Deparment对象并传递POCO对象
public void AddEmployee(FormCollection formCollection)
{
Department d = new Deparmtent; d.id = ""; //based on the dropdown value
d.name="" //based on the dropdown selected text;
Employee e = new Employee; e.Name. e. sal....
e.Department = d;
EmployeeManager.AddEmployee(e);
}
但是在管理层,我认为,我仍然需要使用LINQ重新创建对部门的引用,这又是重复的,似乎不是一个干净的解决方案。
有更好的方法来处理这个问题吗?寻找建议和最佳实践。
答案 0 :(得分:1)
首先,您是否有任何理由不使用MVC版本3?没有重大的突破性变化,所以也可以升级?
其次是使用FormCollection而不是强类型模型绑定的原因吗?只需更改您的视图以使用强类型HTML帮助程序(如<%: Html.TextBoxFor(m => m.Property) %>
),或确保name
属性与属性名称匹配,并让控制器接收类型,模型绑定将完成剩下的工作。有很多教程展示了这一点,以及解释它的文章。模型绑定将与名称/值集合一起使用,例如作为表单发布,或者与JSON数据一起使用,或者您可以查找/编写自定义模型绑定器,以抵抗您想要的任何古怪的序列化协议。
当传递实体框架将存储的实际实体类型时,要注意的一件事是,在更新现有对象时,或者对现有对象的外键引用时必须小心 - 所有对象必须附加到正确的实体框架上下文。为了实现这一点,您将经常看到控制器接收到的对象将其属性从上下文复制到新近检索的实体,手动或通过某种对象映射器。
答案 1 :(得分:1)
创建一个名为“BusinessObjects”或“Model”的单独项目,其中包含您的POCO。然后对MVC使用强类型模型绑定,您将被设置。
方法签名看起来像这样:
// In your Controller
public void AddEmployee(Employee newObject)
{
YourDataContext dc = new YourDataContext();
dc.Employees.Add(newObject);
dc.SaveChanges();
}