Définition d'une clé étrangère à null lors de l'utilisation d'entity framework code first
Je suis en utilisant la base de données de mise en œuvre de l'Entity Framework Code First que la couche de données pour un projet, mais j'ai couru dans un problème.
J'ai besoin d'être en mesure de définir une clé étrangère à null pour supprimer une association dans la base de données.
J'ai 2 objets. L'un est appelé 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 être en mesure de supprimer un employé d'un projet et d'avoir le champ Employé nulle. Dans mon UI ce sera indiqué comme "Non Employés Affectés".
Cependant, à court d'une requête sql, je n'arrive pas à trouver un moyen de le faire dans l'entity framework 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 ce n'est pas faire n'importe quoi.
Quelqu'un a une idée?
Vous devez vous connecter pour publier un commentaire.
Je pense que le problème est que dans la mesure où le contexte est concerné, vous n'avez pas fait quelque chose de changé.
Vous pouvez utiliser le chargement paresseux approche déjà suggéré en utilisant
virtual
, mais puisque vous n'avez pas demandé à ce que l'Employé d'être encore chargé, il est toujours null. Vous pouvez essayer ceci:Sinon, explicitement inclure dans votre demande initiale:
Sur une note de côté,
FirstOrDefault
sera de retournull
si aucuneProject
correspond à l'id donné. Si vous savez que le projet existe, vous pouvez simplement utiliserFirst
. Vous pourriez même utiliserSingle
qui affirment qu'il n'y a qu'un seul projet. Si vous continuez à utiliserFirstOrDefault
, je vous recommande de vérifiernull
avant de travailler avecproject
.Vous pouvez le faire de cette façon, ce qui signifie que vous n'avez pas à charge de l'entité associée.
La réponse à cette question est assez simple. EF ne pouvez pas déduire le type de la donnée à l'information que vous avez fournie.
Viens de le faire à la place:
et il va fonctionner.
si vous activez le chargement paresseux en faisant de l'employé de la propriété virtuelle fonctionne-t-cela?
je voudrais aussi suggérer l'encapsulation de la suppression de la méthode dans le cadre de votre classe poco à rendre le sens plus clair. voir cette l'article pour plus de détails sur cette.
Vous devez inclure dans la requête linq, la propriété de céder, en utilisant le même nom, il a dans le Projet de classe:
Comme une autre solution, j'ai compilé deux méthodes dans une méthode d'extension:
Cela vous permet de fournir une DbContext si vous en avez un, dans ce cas, il va utiliser la méthode la plus efficace et définir la CurrentValue de l'Entrée de Référence à null.
Si aucune DBContext est fourni, il sera paresseux charge en premier.