【发布时间】:2011-07-03 16:37:26
【问题描述】:
我在创建复杂对象时遇到了很大的困难。我有一个带有顾问表的 EF 模型,该表与许多其他表具有一对多的关系。我想按原样使用 Consultant 对象作为模型,因为它非常简单和容易(正如在 NerdDinner 教程中所做的那样),就像我对其他没有一对多关系的对象所做的那样.问题是这些关系导致这个错误:当我尝试发布到 Create 方法时,“EntityCollection 已经初始化”。
有几个人建议我改用 ViewModel,我发布了一个关于此的问题 (ViewModels and one-to-many relationships with Entity Framework in MVC?),因为我不太了解它。问题是代码变得非常荒谬......这与我迄今为止在 MVC 中所欣赏的简单性相去甚远。
在那个问题中我忘了提到除了 Create 方法之外,Edit 方法使用相同的 CreateConsultant 方法(名称可能具有误导性,它实际上填充了 Consultant 对象)。因此,为了在编辑时不添加额外的“程序”,我需要进一步复杂化该方法。所以现在看起来像这样:
private Consultant CreateConsultant(ConsultantViewModel vm, Consultant consultant) //Parameter Consultant needed because an object may already exist from Edit method.
{
consultant.Description = vm.Description;
consultant.FirstName = vm.FirstName;
consultant.LastName = vm.LastName;
consultant.UserName = User.Identity.Name;
if (vm.Programs != null)
for (int i = 0; i < vm.Programs.Count; i++)
{
if (consultant.Programs.Count == i)
consultant.Programs.Add(vm.Programs[i]);
else
consultant.Programs.ToList()[i] = vm.Programs[i];
}
if (vm.Languages != null)
for (int i = 0; i < vm.Languages.Count; i++)
{
if (consultant.Languages.Count == i)
consultant.Languages.Add(vm.Languages[i]);
else
consultant.Languages.ToList()[i] = vm.Languages[i];
}
if (vm.Educations != null)
for (int i = 0; i < vm.Educations.Count; i++)
{
if (consultant.Educations.Count == i)
consultant.Educations.Add(vm.Educations[i]);
else
consultant.Educations.ToList()[i] = vm.Educations[i];
}
if (vm.WorkExperiences != null)
for (int i = 0; i < vm.WorkExperiences.Count; i++)
{
if (consultant.WorkExperiences.Count == i)
consultant.WorkExperiences.Add(vm.WorkExperiences[i]);
else
consultant.WorkExperiences.ToList()[i] = vm.WorkExperiences[i];
}
if (vm.CompetenceAreas != null)
for (int i = 0; i < vm.CompetenceAreas.Count; i++)
{
if (consultant.CompetenceAreas.Count == i)
consultant.CompetenceAreas.Add(vm.CompetenceAreas[i]);
else
consultant.CompetenceAreas.ToList()[i] = vm.CompetenceAreas[i];
}
string uploadDir = Server.MapPath(Request.ApplicationPath) + "FileArea\\ConsultantImages\\";
foreach (string f in Request.Files.Keys)
{
var filePath = Path.Combine(uploadDir, Path.GetFileName(Request.Files[f].FileName));
if (Request.Files[f].ContentLength > 0)
{
Request.Files[f].SaveAs(filePath);
consultant.Image = filePath;
}
}
return consultant;
}
这很荒谬,可能是由于我的无能,但我需要知道如何正确地做到这一点。仅仅回答“使用 ViewModel”显然是不够的,因为这就是让我一开始就陷入困境的原因。我想要简单实体对象作为模型的简单性,但没有“EntityCollection 已被初始化”错误。我该如何解决这个问题?
当然,如果我只是以错误的方式执行 ViewModel 策略,那么也欢迎提出建议,但主要是我想知道如果我以简单的“NerdDinner”简单对象方式执行此错误,是什么原因造成的。请记住,有问题的视图仅限于网站的授权用户。我很想以“正确”的方式来做,但如果使用 ViewModels 意味着代码很难维护,我会放弃它......
请帮忙!
更新:
原来这段代码甚至不起作用。我只是在调用 Edit 以更新值后进行了检查,但它并没有更新它们。所以只有创建部分有效。
这是不起作用的部分:
consultant.Programs.ToList()[i] = vm.Programs[i];
我有一种预感,我无法使用 ToList 并更新 EntityCollection 中的项目。但这让它变得更加困难。所以现在我不知道如何直接处理实体,我更喜欢(见上文)。而且我不知道如何让这些 ViewModel 工作,更不用说把它弄干净了......
有什么想法吗?这里肯定有什么问题,我希望有人能发现我是如何遗漏了一些简单的东西,导致所有这些代码都颠倒了!
【问题讨论】:
-
错误具体发生在哪里?
-
如果我没有上面的代码(这是尝试使用 ViewModel 代替),而是从视图接收一个顾问对象返回到 Post Create 方法,就会发生这种情况。它永远不会到达方法(这意味着我不能设置断点来跟踪它,因为它永远不会到达那里)。相反,代码在 EF 模型设计器代码中的任何一个集合(关系的多方面)处停止,例如“程序”,并且会说这个 EntityCollection 已经被初始化了”。
标签: asp.net entity-framework asp.net-mvc-3 entity viewmodel