首页 文章

实体框架 - 代码优先 - 更新不会更改外键

提问于
浏览
0

我只是找不到任何更改外键的代码 . 如何告知上下文外键已更改以便更新数据库?我一直试图让这个工作2个月了:

These are the models:

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对象中已更改,上述代码也不会更新项目状态外键 . 该对象的返回格式与Web API提供的格式相同,但更新了Project Status对象:

[{"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 });

我也试过这个:

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

这些是从我的模型自动创建的表T-SQL文件:

Projects Table:

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

Project Statuses Table

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 回答

  • 1

    你需要做两件事 . 首先明确说明每个类的主键 .

    添加 [Key] 属性

    Project 上课,上面 public int ProjectId { get; set; }

    ProjectStatus 上课,上面的行 public int ProjectStatusId { get; set; }

    其次,将外键的属性添加到 Project 类 . 添加此行:

    public int ProjectStatusId { get; set; }
    

相关问题