Comment puis-je utiliser EF pour ajouter plusieurs entités enfants à un objet lorsque l'enfant a une clé d'identité?

Nous utilisons EF5 et SQL Server 2012, les deux classes suivantes:

public class Question
{
    public Question()
    {
        this.Answers = new List<Answer>();
    }
    public int QuestionId { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Answer> Answers { get; set; }

}
public class Answer
{
    public int AnswerId { get; set; }
    public string Text { get; set; }
    public int QuestionId { get; set; }
    public virtual Question Question { get; set; }
}

Cartographie est comme suit:

public class AnswerMap : EntityTypeConfiguration<Answer>
{
    public AnswerMap()
    {
        //Primary Key
        this.HasKey(t => t.AnswerId);

        //Identity
        this.Property(t => t.AnswerId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

Base de données DDL

CREATE TABLE Answer (
    [AnswerId] INT IDENTITY (1, 1) NOT NULL,
    [QuestionId] INT NOT NULL,
    [Text] NVARCHAR(1000),
    CONSTRAINT [PK_Answer] PRIMARY KEY CLUSTERED ([AnswerId] ASC)
)";

Voici les résultats de ce que j'ai essayé:

Ce qui fonctionne pour un enfant:

var a = new Answer{
    Text = "AA",
    QuestionId = 14
};
question.Answers.Add(a);
_uow.Questions.Update(question);
_uow.Commit();

Cela ne fonctionne pas pour plus d'un enfant:

Erreur: Un objet avec la même clé existe déjà dans le Vousmanager. Le Vousmanager ne peut suivre plusieurs objets avec la même clé.

var a = new Answer{
    AnswerId = 0,
    Text = "AAA",
    QuestionId = 14
};
var b = new Answer {
    AnswerId = 0,
    Text = "BBB",
    QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();

Cela ne fonctionne pas pour plus d'un enfant:

Il crée AnswerID 1000 et 1001, mais je veux une nouvelle carte d'identité pour être créé par la base de données.

var a = new Answer{
    AnswerId = 1000,
    Text = "AAA",
    QuestionId = 14
};
var b = new Answer {
    AnswerId = 1001,
    Text = "BBB",
    QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();

Ne fonctionne pas:

D'erreur du compilateur. Ne peut pas convertir la valeur null pour int

var a = new Answer{
    AnswerId = null,
    Text = "AAA",
    QuestionId = 14    
};
var b = new Answer
{
    AnswerId = null,
    Text = "BBB",
    QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();

Ne fonctionne pas:

Vousmanager ne peut suivre plusieurs objets avec la même clé.

var a = new Answer{
    Text = "AAA",
    QuestionId = 14
};
var b = new Answer
{
    Text = "BBB",
    QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();

Dans mon application j'ai un ou de plusieurs nouveaux Réponse objets générés sur le client, puis ceux-ci sont envoyés au serveur. Au-dessus de je suis la simulation de ce qui va se passer sans ajouter le client sur la question. Notez que l'ajout de toutes les Réponses à la Question de l'objet se fait sur le client, puis vient dans une chaîne JSON pour le serveur. Il est alors désérialisé à une Question de l'Objet comme ceci:

public HttpResponseMessage PutQuestion(int id, Question question) {
            _uow.Questions.Update(question);
            _uow.Commit();

Je veux que chacun de Répondre à créer des objets avec un new identity IDpour qu'elles soient ajoutées à la Question de l'objet et pour la Question de l'objet à être retourné de la manière normale.

Je ne sais pas comment cela peut être fait. Tous mes tests simples jusqu'à présent ne fonctionnent pas. Veuillez noter que ceci est une variation sur une question précédente par notre membre du groupe qui l'était moins, et que je suis en train de fermer. Cette question est, je l'espère, de plus en plus clair.

Notes:

Ici est la façon dont la mise à jour est codé:

public virtual void Update(T entity)
{
    DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
    if (dbEntityEntry.State == EntityState.Detached)
    {
        DbSet.Attach(entity);
    }  
    dbEntityEntry.State = EntityState.Modified;
}

source d'informationauteur Melina