在一对多关系

时间:2017-04-28 12:59:14

标签: javascript c# angularjs entity-framework

我希望有人可以帮助我,这让我现在已经把头发撕了两天了。

我使用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)对象尚未更新。

我已经在下面列出了我认为是我项目相关部分的截图。任何帮助将不胜感激。

enter image description here

enter image description here

enter image description here

应用

总体应用程序表的相关模型属性。

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();
    }

0 个答案:

没有答案