Entity Framework: Définir la Suppression de la Règle avec CodeFirst
Je suis en utilisant EF4 CTP 5, CodeFirst.
Veuillez voir mes classes de première:
public class Guest
{
[Key]
public Guid GuestID { get; set; }
public Language PreferredLanguage { get; set; }
public Guid? LanguageID { get; set; }
}
public class Language
{
[Key]
public Guid LanguageID { get; set; }
[Required(ErrorMessage = "Enter language name")]
[StringLength(50, ErrorMessage = "Language name is too long")]
public string LanguageName { get; set; } //in origine language
}
Mon objectif est de définir un certain "Supprimer la Règle" pour l'Invité de la Langue de la relation. Quand une langue est supprimé, je ne voulez pas supprimer la clients (donc PAS effacer en cascade). Au lieu de cela, je veux l'invité du LanguageID être "Set NULL".
Que j'espérais pour les API fluent pour me soutenir ici. Mais je ne pouvais pas trouver quelque chose d'utile en plus .WillCascadeOnDelete(bool), qui ne fournit pas les options dont j'ai besoin. Ai-je raté quelque chose? Ou est-ce tout simplement pas mis en œuvre en CTP 5?
Merci pour toute aide!
Vous devez vous connecter pour publier un commentaire.
Ce que vous cherchez peut être atteint par la mise en place d'un facultatif association entre
Guest
etLanguage
entités:Unité De Test:
Comme un résultat, nous allons finir par avoir un
guest
record avec un DB valeur null pour le LanguageID FK colonne.Mise à jour:
Première nous allons voir pourquoi ci-dessus de l'Unité de Test a réussi par la recherche dans le générateur de profils SQL. Le ci-dessous montre la trace à droite après l'appel de la deuxième SaveChanges() la méthode:
Donc, comme vous pouvez le voir, EF est assez intelligent pour le premier jour de l'invité d'enregistrement en réglant sa
LanguageID
à null et de faire ensuite une instruction delete pour supprimer la langue à l'enregistrement qui est la valeur par défaut EF comportement lorsque vous définissez l'option de l'association. Ainsi, il a été pris en charge sur le côté application par EF et bien sûr, vous obtiendrez une erreur de la SGBD si vous essayez de supprimer manuellement la langue d'enregistrement à l'intérieur de SQL Server comme vous l'avez également mentionné.Cependant, il ya plus à cette histoire. Considérez les points suivants de l'unité de test:
Cela ne parvient pas à lancer une SQLException contient le message exact que vous avez obtenu à partir du Serveur SQL, tout en essayant de supprimer manuellement l'enregistrement. La raison en est que dans la deuxième unité de test nous n'avons connexes invité objet chargé dans le contexte ainsi que de l'EF n'est pas au courant et ne se soumettent pas à la nécessaire mise à jour de la déclaration comme il l'a fait dans le premier exemple.
Revenir à votre question, malheureusement EF Premier Code ne permet pas explicitement changement de supprimer/mettre à jour la règle sur les relations, mais on peut toujours recourir à SqlCommand méthode que vous pouvez voir un exemple de cela dans ce post. Dans votre cas, nous pouvons code:
Qui est ce que vous cherchez. Avec le dessus de graines de méthode en place, la seconde unité de test sera également passer.
Espère que cette aide,
Morteza
Seed
méthode est qu'elle s'exécute chaque fois que vous appelezUpdate-Database
. De EF5 onward vous pouvez exécuter Sql à partir d'une seule migration: stackoverflow.com/a/27907742/150342Avec Entity Framework Core, j'ai fait quelque chose comme ça...