Après avoir créé un nouvel objet (Foo), je définis la clé (BarId) pour une propriété d'association EntityRef (Bar). Je veux ensuite insérer le nouvel objet dans la base de données, et être en mesure d'accéder à l'objet enfant paresseux chargé par la suite.InsertOnSubmit ne joint pas?
Malheureusement, la propriété de chargement paresseux renvoie null après l'appel à InsertOnSubmit(). Il retourne l'objet correct si je joins à la place Attach() l'objet au contexte de données, cependant.
Code est ici qui insère avec succès mon nouvel objet dans la base de données, mais ne pas correctement la configuration de chargement paresseux pour l'enfant propriété Bar:
var foo = new Foo();
foo.BarId = 123;
context.GetTable<Foo>().InsertOnSubmit(foo);
foo.Bar.Something(); // throws NullReferenceException
Ici, l'objet de la barre est correctement chargé:
var foo = new Foo();
foo.BarId = 123;
context.GetTable<Foo>().Attach(foo);
foo.Bar.Something(); // method is called on lazy-loaded Bar object
appel avant d'attacher InsertOnSubmit provoque ce dernier de jeter un « Impossible d'ajouter une entité qui existe déjà » exception.
Donc, est-ce un bug dans LINQ-to-SQL, où les objets insérés ne sont pas correctement attachés au contexte de données?
Comment résoudre ce problème?
Lors de l'utilisation de InsertOnSubmit, vous avez besoin de SaveChanges pour soumettre le nouvel objet au magasin de données. Cela pourrait être le problème, puisque la création d'un nouvel élément de données n'associe pas intrinsèquement un contexte de données (à un chargement paresseux de) jusqu'à ce que l'objet soit peuplé par le contexte (je pense). –
Je vois. Malheureusement, j'ai construit une couche de sécurité au-dessus de mon contexte de données qui vérifie les permissions d'objet/utilisateur avant d'appeler SubmitChanges(). Ce code doit accéder à certaines propriétés de mes objets, y compris ceux qui sont chargés paresseux. Si c'est une bonne idée est discutable, mais c'est ce que je dois travailler maintenant. – MikeWyatt
@NickLarsen: Je viens de tester cela, et vous avez raison. Le chargement paresseux fonctionne après avoir appelé SubmitChanges(). – MikeWyatt