首先使用实体​​框架代码时将外键设置为null

mcc*_*002 35 c# entity-framework-4.1

我正在使用数据库第一次实现Entity Framework Code First作为项目的数据层,但我遇到了一个问题.

我需要能够将外键设置为null,以便删除数据库中的关联.

我有2个物体.一个叫做项目.

public class Project
{
    public int ProjectId {get; set;}
    public Employee Employee {get;set;}
}

public class Employee
{
    public int EmployeeId {get; set;}
    public string EmployeeName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

这匹配我在数据库中的内容:

CREATE TABLE Project(
    ProjectId int IDENTITY(1,1) NOT NULL,
    EmployeeId int NULL
)

CREATE TABLE Project(
    EmployeeId int IDENTITY(1,1) NOT NULL,
    EmployeeName varchar(100) NULL
)
Run Code Online (Sandbox Code Playgroud)

我可以将一个Employee分配给一个项目.但是,我希望能够从项目中删除员工并使Employee字段为空.在我的UI中,这将显示为"No EMployee Assigned".

但是,如果没有直接的sql查询,我似乎无法在实体框架4.1中找到这样做的方法.

我试过了:

public void RemoveEmployeeFromProject(int projectId)
{
    var project = Context.Projects.FirstOrDefault(x => x.ProjectId == projectId);
    project.Employee = null;
    Context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

但这没有做任何事情.

有没有人有任何想法?

Dav*_*tka 65

我认为问题是,就上下文而言,你实际上没有改变任何东西.

您可以使用之前通过使用建议的延迟加载方法virtual,但由于您尚未请求尚未加载Employee,因此它仍为null.你可以试试这个:

var forceLoad = project.Employee;
project.Employee = null; // Now EF knows something has changed
Context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

或者,明确将其包含在原始请求中:

var project = Context.Projects.Include(x => x.Employee).FirstOrDefault(x => x.ProjectId == projectId);
project.Employee = null;
Context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

在旁注中,如果不匹配给定的id ,FirstOrDefault则返回.如果你知道项目存在,你可以使用.您甚至可以使用哪个断言只有一个这样的项目.如果您继续使用,我建议您在使用前进行检查.nullProjectFirstSingleFirstOrDefaultnullproject

  • 有同样的问题,非常有帮助,得到我的+1 (2认同)
  • 我认为这是EF中的一个错误.请参阅问题https://entityframework.codeplex.com/workitem/2074以及相关的SO问题http://stackoverflow.com/questions/21692401/entity-framework-will-only-set-related-entity-property-to-null - 如果,我先弄 (2认同)

Spr*_*tar 10

您可以这样做,这意味着您不必加载相关实体.

context.Entry(Project).Reference(r => r.Employee).CurrentValue = null;
Run Code Online (Sandbox Code Playgroud)