Javascript 在一对多关系上创建重复条目

Javascript 在一对多关系上创建重复条目,javascript,c#,angularjs,entity-framework,Javascript,C#,Angularjs,Entity Framework,我希望有人能在这里帮我,这已经让我两天都很烦恼了 我有一个使用AngularJS构建的小系统,使用实体框架代码优先项目作为数据层。然而,要使ProjectDetails和ProjectType之间的一对多关系正常工作,我遇到了一些问题 ProjectTypes表包含4条记录(每条记录都是项目的一种类型),ProjectDetails表中的每条记录都应该包含其中一条记录的ID作为外键。一切都很直截了当 代码编译得很好,但是当我运行它时,它表现出一些奇怪的行为,我不确定问题是出在EF映射还是我的An

我希望有人能在这里帮我,这已经让我两天都很烦恼了

我有一个使用AngularJS构建的小系统,使用实体框架代码优先项目作为数据层。然而,要使ProjectDetails和ProjectType之间的一对多关系正常工作,我遇到了一些问题

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; }
选择选项标签:

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

请显示保存项目的服务器端代码。您好,我已经添加了保存表单的代码。如上所述,它不会更新表单,而是创建一个新版本。嗯……为什么
existingItem.ApplicationGuid=Guid.NewGuid();
如果它正在更新?另外,请注意`\u context.Application.Add(existingItem);`the
Add(object)如果当前上下文未跟踪
现有项
,则
将插入新行。因此,最好先将
您的
现有项
附加到该项上……(它将使用主键进行更新-因此主键是必需的)。抱歉,该方法的名称有误导性。该方法所做的是在每次提交表单时创建一个新记录,而不是更新原始记录。这是客户的要求。非常常见的混淆:
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();
    }