2014-05-23 101 views
0

我只是找不到任何更改外鍵的代碼。如何告訴上下文外鍵已更改,以便更新數據庫?我一直在試圖得到這個現在工作2個月:實體框架 - 代碼優先 - 更新不會更改外鍵

這些機型:

namespace MyApp.WebApi.Models 
{ 

public class Project 
{ 
    public int ProjectId { get; set; } 
    public string Description { get; set; } 
    public string Name { get; set; } 

    // Foreign Key - Project Status 

    public virtual ProjectStatus ProjectStatus { get; set; } 
} 

public class ProjectStatus 
{ 
    public int ProjectStatusId { get; set; } 
    public string Name { get; set; } 
} 

public class HerculesWebApiContext : DbContext 
{ 
    public HerculesWebApiContext() : base("name=HerculesWebApiContext") { } 

    public DbSet<Project> Projects { get; set; } 
    public DbSet<ProjectStatus> ProjectStatuses { get; set; } 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) { } 
} 
} 

這是Web API控制器:

namespace MyApp.WebApi.Controllers 
{ 
public class ProjectController : ApiController 
{ 
    private HerculesWebApiContext db = new HerculesWebApiContext(); 

    public void PutProject(int id, [FromBody]Project project) 
    { 
     if (!ModelState.IsValid) throw new HttpResponseException(HttpStatusCode.BadRequest); 
     if (id != project.ProjectId) throw new HttpResponseException(HttpStatusCode.BadRequest); 


     // I need some code here to tell EF that the FK has changed 

     db.Entry(project).State = EntityState.Modified; 


     // Try catch around this 

     db.SaveChanges(); 
    } 

以上即使代碼在傳遞給函數的JSON對象中發生了更改,代碼也不會更新項目狀態外鍵。

[{"ProjectStatus":{"ProjectStatusId":2,"Name":"Started"},"ProjectId":3,"Description":"test description","Name":"test project"}] 

我曾嘗試:

db.Projects.Attach(db.Projects.Single(c => c.ProjectId == project.ProjectId)); 

     ((IObjectContextAdapter)db).ObjectContext 
      .ApplyCurrentValues("Projects", project); 

我也曾嘗試:

db.Entry(project.ProjectStatus).CurrentValues.SetValues(new ProjectStatus { ProjectStatusId = project.ProjectStatus.ProjectStatusId }); 
對象在該Web API提供它的格式相同,但與更新項目狀態對象返回

我也試過這個:

var per = new ProjectStatus { ProjectStatusId = project.ProjectStatus.ProjectStatusId }; // create the stub 
db.ProjectStatuses.Attach(per); 
db.Entry(project.ProjectStatus).CurrentValues.SetValues(per); 

這些都是系統自動從我的模型創建表T-SQL文件:

項目表:

CREATE TABLE [dbo].[Projects] (
[ProjectId]      INT   IDENTITY (1, 1) NOT NULL, 
[Description]     NVARCHAR (MAX) NULL, 
[Name]       NVARCHAR (MAX) NULL, 
[ProjectStatus_ProjectStatusId] INT   NOT NULL, 
CONSTRAINT [PK_dbo.Projects] PRIMARY KEY CLUSTERED ([ProjectId] ASC), 
CONSTRAINT [FK_dbo.Projects_dbo.ProjectStatus_ProjectStatusId] FOREIGN KEY ([ProjectStatus_ProjectStatusId]) REFERENCES [dbo].[ProjectStatus] ([ProjectStatusId]) ON DELETE CASCADE 

項目以下狀態表

CREATE TABLE [dbo].[ProjectStatus] (
[ProjectStatusId] INT   IDENTITY (1, 1) NOT NULL, 
[Name]   NVARCHAR (MAX) NULL, 
CONSTRAINT [PK_dbo.ProjectStatus] PRIMARY KEY CLUSTERED ([ProjectStatusId] ASC) 
); 
+1

是不是缺少'public int ProjectStatusId {get;組; ''在'Project'模型中? – DavidG

+0

我確實有過,但是它在Project DB表中爲項目狀態創建了2個字段。這似乎創建DB正確與項目表中的1個字段與FK關係'ProjectStatus_ProjectStatusId' –

+1

也許是因爲主鍵沒有明確指定?將'[Key]'屬性添加到'Project'中的'ProjectId'和'ProjectStatus'中的'ProjectStatusId'中 – DavidG

回答

1

你需要做兩的東西。首先明確說明每個類的主鍵。

[Key]屬性添加到

Project類線以上public int ProjectId { get; set; }

ProjectStatus類,行public int ProjectStatusId { get; set; }

上述其次添加屬性爲你的外鍵,您的Project類。添加此行:

public int ProjectStatusId { get; set; }