我在创建一个复杂的对象时遇到了很大的困难。我有一个带有顾问表的 EF 模型,该表与许多其他表具有一对多关系。我想按原样使用 Consultant 对象作为模型,因为它非常简单(正如 NerdDinner 教程中所做的那样),就像我对其他没有一对多关系的对象所做的那样。问题是,当我尝试发布到 Create 方法时,这些关系会导致此错误:“EntityCollection 已初始化”。
有几个人建议我改用 ViewModel,我发布了一个关于此的问题(MVC 中的 ViewModel 和与实体框架的一对多关系? https://stackoverflow.com/questions/5083880/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 意味着代码很难维护,我会放弃它......
请帮忙!
UPDATE:
事实证明这段代码根本不起作用。我只是在调用编辑更新值后进行了检查,但它没有更新它们。所以只有创建部分有效。
这是不起作用的部分:
consultant.Programs.ToList()[i] = vm.Programs[i];
我有一种预感,我无法使用 ToList 并更新 EntityCollection 中的项目。但这使得事情变得更加困难。所以现在我不知道如何直接对实体进行操作,我更喜欢这样做(见上文)。我不知道如何让这个 ViewModel 的东西工作,更不用说让它干净了......
有任何想法吗?这里一定有什么真正的错误,我希望有人会发现我是如何错过了一些简单的东西,使所有这些代码都发生了转变!