我希望有人可以帮助我,这让我现在已经把头发撕了两天了。
我使用AngularJS构建了一个小型系统,使用Entity Framework Code First项目作为数据层。但是,我在使ProjectDetails和ProjectTypes之间的一对多关系正常工作时遇到了一些麻烦。
ProjectTypes表包含4条记录(每种类型都是一个项目),ProjectDetails表中的每条记录都应包含其中一条记录的ID作为外键。一切都很直接。
代码编译得很好,但是当我运行它时会出现一些奇怪的行为,而且我不确定问题出在EF映射还是我的AngularJS代码上。
AngularJS页面是一个允许用户通过下拉列表选择项目类型的表单。初始表单提交很好,并添加了正确的项目类型。但是,如果我返回并编辑表单(选择新项目类型),它会复制ProjectType表中当前选定的项目类型,并将新类型的ID分配给表单提交。
我使用Chrome中的console.log在提交编辑后的表单时查看模型。 ProjectType_Id属性(application.projectdetails.projecttype_id)已正确更新,但ProjectType(application.projectdetails.projecttype)对象尚未更新。
我已经在下面列出了我认为是我项目相关部分的截图。任何帮助将不胜感激。
应用
总体应用程序表的相关模型属性。
public ProjectDetails ProjectDetails { get; set; }
项目详情
“项目详细信息”表的相关模型属性(与“应用程序”的1-1关系。
public Nullable<int> ProjectType_Id { get; set; }
public virtual Application Application { get; set; }
public virtual ProjectType ProjectType { get; set; }
项目类型
“项目类型”表的相关模型属性,它是与“项目详细信息”的1-many关系。
public virtual ICollection<ProjectDetails> ProjectDetails { get; set; }
映射
modelBuilder.Entity<Application>()
.HasOptional(p => p.ProjectDetails)
.WithOptionalPrincipal(o => o.Application)
.Map(x => x.MapKey("Application_Id"));
modelBuilder.Entity<ProjectDetails>()
.HasOptional<ProjectType>(s => s.ProjectType)
.WithMany(s => s.ProjectDetails)
.HasForeignKey(s => s.ProjectType_Id);
角度模板
这是AngularJS代码,它包含在表单的SELECT下拉菜单中。 projecttypes是一个$ scope变量,它通过Web服务调用填充。
选择菜单标签:
ng-model="application.ProjectDetails.ProjectType_Id"
选择选项标签:
ng-repeat="p in projecttypes" value="{{p.Id}}">{{p.ProjectName}}
后端保存代码:
这不直接更新表单,而是创建应用程序的新版本。
public void UpdateApplication(Application existingItem)
{
if (existingItem == null)
throw new ValidationException("An application is required.");
if (existingItem.ParentApplication == 0)
{
existingItem.ParentApplication = existingItem.Id;
}
existingItem.Id = 0;
existingItem.DateSubmitted = DateTime.Now;
existingItem.LatestVersion = true;
existingItem.ApplicationGuid = Guid.NewGuid();
_context.Application.Add(existingItem);
_context.SaveChanges();
}