Comment attacher un objet Entity Framework qui ne provient pas de la base de données?

.net-3.5 c# entity-framework linq-to-entities

Question

J'ai une séparation complète de mes objets Entity Framework et de mes objets POCO, je les traduis simplement dans les deux sens ...

c'est à dire:

// poco
public class Author
{
   public Guid Id { get; set; }
   public string UserName { get; set; }
}

et puis j'ai un objet EF "Auteurs" avec les mêmes propriétés ..

J'ai donc mon objet métier

var author = new Author { UserName="foo", Id="Guid thats in the db" };

et je veux sauvegarder cet objet afin que je fasse ce qui suit:

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 ne peut pas être attaché à un contexte d'objet.

EDIT: Il semble que je doive utiliser des entités.AttachTo ("Authors", dbAuthor); attacher sans EntityKey, mais j'ai ensuite des chaînes magiques codées en dur, qui se briseront si je change le nom de mes ensembles d'entités et que je n'aurai aucune vérification du temps de compilation ... Puis-je attacher un moyen de garder la vérification du temps de compilation ?

J'espère que je serais capable de le faire, car des chaînes codées en dur éliminant la validation du temps de compilation seraient nulles =)

Réponse acceptée

Avez-vous essayé d’utiliser AttachTo et de spécifier le jeu d’entités? ..

entities.AttachTo("Authors", dbAuthor);

"Authors" serait le nom de votre ensemble d'entités actuel.

Modifier:
Oui, il y a un meilleur moyen (enfin, il devrait l'être). Le concepteur aurait dû générer pour l’objet ObjectContext des méthodes «Add» qui se traduisent par l’appel ci-dessus. Vous devriez donc pouvoir:

entities.AddToAuthors(dbAuthor);

qui devrait être littéralement:

public void AddToAuthors(Authors authors)
{
    base.AddObject("Authors", authors);
}

défini dans le fichier Whateverobjectcontext.designer.cs.


Réponse populaire

Je viens de voir ça maintenant. Si vous souhaitez lier () à ObjectContext, c’est-à-dire convaincre le framework d’entités qu’une entité existe déjà dans la base de données et que vous voulez éviter d’utiliser des chaînes magiques, c’est-à-dire

ctx.AttachTo("EntitySet", entity);

Vous pouvez essayer deux possibilités basées sur des méthodes d'extension, les deux rendant définitivement la vie plus supportable.

La première option vous permet d'écrire:

ctx.AttachToDefault(entity);

et est couvert ici: Astuce 13 - Comment attacher une entité facilement

La deuxième option vous permet d’écrire:

ctx.EntitySet.Attach(entity);

et est couvert ici: Astuce 16 - Comment imiter l’ObjectSet de .NET 4.0 aujourd’hui

Comme vous pouvez le constater, les deux sont très faciles à utiliser et évitent les chaînes.

J'espère que cela t'aides

Alex



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow