39 votes

Définition d'une clé étrangère à null lors de l'utilisation du code du cadre d'entité d'abord

J'utilise la première implémentation de la base de données d'Entity Framework Code First comme couche de données pour un projet, mais j'ai rencontré un problème.

Je dois être en mesure de définir une clé étrangère comme nulle afin de supprimer une association dans la base de données.

J'ai 2 objets. L'un s'appelle Projet.

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

Cela correspond à ce que j'ai dans la base de données :

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
)

Je peux affecter un employé à un projet. Cependant, je veux pouvoir retirer un employé d'un projet et faire en sorte que le champ Employé soit nul. Dans mon interface utilisateur, cela se traduira par "Aucun employé affecté".

Cependant, à part une requête sql directe, je n'arrive pas à trouver un moyen de le faire dans le cadre de l'entité 4.1.

J'ai essayé :

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

Mais cela ne fait rien.

Quelqu'un a-t-il une idée ?

0voto

David Wick Points 4997

Si vous activez le chargement paresseux en rendant la propriété employee virtuelle, cela fonctionne-t-il ?

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

je suggérerais également d'encapsuler la méthode de suppression dans votre classe poco afin de rendre la signification plus claire. cf. este pour plus de détails à ce sujet.

public class Project
{
    public int ProjectId {get; set;}
    public virtual Employee Employee {get;set;}
    public void RemoveEmployee()
    {
        Employee = null;
    }
}

0 votes

Malheureusement, non, ça ne marche pas. Je pense que cela est dû en partie au fait qu'avec le chargement paresseux activé, les valeurs que vous ne demandez pas sont définies comme nulles. Ainsi, lorsque vous appelez Context.SaveChanges, il doit ignorer les valeurs nulles afin de ne pas remplacer les valeurs réelles par des valeurs qu'il n'a pas chargées. Cela est logique jusqu'à ce que vous vouliez réellement définir une valeur comme nulle.

0 votes

Je pensais que ça avait quelque chose à voir avec le chargement paresseux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X