Comment puis-je joindre un objet Entity Framework qui n'est pas à partir de la base de données?
J'ai une séparation complète de mon Entity Framework objets et mes objets POCO, je viens de les traduire en arrière et en avant...
je.e:
//poco
public class Author
{
public Guid Id { get; set; }
public string UserName { get; set; }
}
et puis j'ai un EF objet "Auteurs", avec les mêmes propriétés..
Donc, j'ai mon objet métier
var author = new Author { UserName="foo", Id="Guid thats in the db" };
et je veux sauver cet objet donc je ne les suivants:
var dbAuthor = new dbAuthor { Id=author.Id, UserName=author.UserName };
entities.Attach(dbAuthor);
entities.SaveChanges();
mais cela me donne l'erreur suivante:
Un objet avec une valeur null EntityKey valeur
ne peut pas être attachée à un objet
contexte.
EDIT:
Il semble que j'ai à utiliser les entités.AttachTo (les"Auteurs", dbAuthor); pour attacher sans EntityKey, mais ensuite j'ai codé en dur de la magie des cordes, ce qui va casser si je change mon entité noms de jeux à tous et j'ai l'habitude ont à tout moment de la compilation, la vérification... Est-il un moyen pour que je puisse le joindre conserve moment de la compilation, la vérification?
J'espère que je serais capable de le faire, que les chaînes codées en dur tuant moment de la compilation validation sucer =)
- Avez-vous cherché à le modifier à ma réponse, il va vous permettre de le faire sans la magie des cordes ou AttachTo que les méthodes sont généré par le concepteur et maintenu par le modèle edmx.
- Oui, je ne suis pas de l'ajouter, je suis à jour, j'ai donc besoin de s'attacher à elle, et enregistrer les modifications
- Je crois toujours que votre modèle a un problème avec l'Id de propriété sur les Auteurs de l'objet n'étant pas défini comme EntityKey, vous devriez vérifier le code XML généré et assurez-vous qu'il est imbriqué dans un élément clé et assurez-vous que l'Id de propriété a l'attribut EdmScalarPropertyAttribute(EntityKeyProperty=true)
- Il a: <EntityType Name="tblAuthors"> <Key> <PropertyRef Name="Id" /> </Key> mais il n'y a pas de quoi à propos de EdmScalarPropertyAttribute
- Le EdmScalarPropertyAttribute serait appliqué à l'Id de la propriété à l'intérieur de la designer.cs fichier pour le modèle. Il doit certainement avoir l'attribut, mais je pense que le EntityKeyProperty paramètre ne peut pas être spécifié.
- Il a: [global::System.Les données.Objets.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé d'utiliser AttachTo et la spécification de l'entité?..
où
"Authors"
serait votre réelle de l'entité nom de l'ensemble.Edit:
Oui, il ya une meilleure façon (eh bien, il devrait être). Le concepteur doit avoir généré "Ajouter" méthodes à ObjectContext pour vous qui traduire à partir de l'appel ci-dessus.. Donc vous devriez être en mesure de le faire:
qui devraient être littéralement:
définis dans le whateverobjectcontext.le concepteur.cs fichier.
AddToAuthors
ne pas utiliserEntitySet.Name
, et votre modifier prétend qu'il fait, donc je suis revenue il. Le principe derrière votre montage me semble bon, et c'est ce qui est utilisé dans une autre réponse, qui j'ai upvoted, et je vous encourage à faire de même.Juste de voir ça maintenant. Si vous voulez Joindre() à ObjectContext, c'est à dire convaincre le cadre de l'entité une entité dans la base de données déjà, et que vous voulez éviter d'utiliser de la magie des cordes c'est à dire
Vous pouvez essayer les deux possibilités en vous basant sur les méthodes d'extension, qui certainement rendre la vie plus supportable.
La première option vous permet d'écrire:
et est couvert ici: Astuce 13 - Comment attacher une entité de la manière facile
La deuxième option vous permet d'écrire:
et est abordé ici: Astuce 16 - Comment imiter .NET 4.0 ObjectSet aujourd'hui
Comme vous pouvez le voir, les deux sont vraiment faciles à utiliser et à éviter les chaînes au total.
Espère que cette aide
Alex
À essayer si vous ne voulez pas écrire la chaîne de caractères avec l'EntitySet nom
une alternative à cela est que les suivantes, en particulier si vous ne savez pas à qui vous allez opérer sur:
Pouvez-vous essayer suivantes
Pour moi,
fonctionne parfaitement. Vous vous demandez si je suis absent quelque chose? Ou il n'est pas de la bonne façon?