Wie kann ich EF hinzufügen mehrere untergeordnete Einheiten, um ein Objekt, wenn das Kind hat eine Identität-Taste?

Sind wir mit EF5 und SQL Server 2012 die folgenden zwei Klassen:

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; }
}

Zuordnung ist wie folgt:

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

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

Datenbank 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)
)";

Hier sind die Ergebnisse, was, die ich versucht habe:

Dies funktioniert bei einem Kind:

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

Dies funktioniert nicht bei mehr als einem Kind:

Fehler: Ein Objekt mit demselben Schlüssel ist bereits vorhanden in der ObjectStateManager. Der ObjectStateManager nicht verfolgen können, mehrere Objekte mit dem gleichen Schlüssel.

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();

Dies funktioniert nicht bei mehr als einem Kind:

Schafft es AnswerID 's 1000 und 1001 aber ich möchte, dass neue Id' s erstellt werden, die von der Datenbank.

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();

Funktioniert nicht:

Compiler-Fehler. Kann nicht konvertieren null 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();

Nicht funktioniert:

ObjectStateManager nicht verfolgen können, mehrere Objekte mit dem gleichen Schlüssel.

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();

In meiner Anwendung habe ich eine oder mehrere neue Antwort-Objekte auf dem client generiert und diese dann an den server gesendet werden. Oben bin ich simulieren, was passieren wird, ohne hinzufügen des client zu der Frage. Beachten Sie, dass die addition aller Antworten zu der Frage-Objekt auf dem client ausgeführt und dann kommt immer in einem JSON-string an den server. Es ist dann deserialisiert, um eine Frage Objekt wie folgt:

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

Ich soll jede Antwort, die Objekte erstellt werden, die mit einem new identity ID, für diese werden Hinzugefügt, um das Frage-Objekt und für das Frage-Objekt zurückgegeben werden, wieder in den normalen Weg.

Ich weiß nicht, wie dies getan werden kann. Alle meine tests bisher nicht funktioniert. Bitte beachten: dies ist eine variation auf eine frühere Frage von unserer Gruppe-Mitglied, das war weniger klar, und ich bin versucht zu schließen. Diese Frage ist, ich hoffe, dass mehr klar.

Hinweise:

Hier ist der Weg, update ist codiert:

public virtual void Update(T entity)
{
    DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
    if (dbEntityEntry.State == EntityState.Detached)
    {
        DbSet.Attach(entity);
    }  
    dbEntityEntry.State = EntityState.Modified;
}
Warum sind Sie hinzufügen Antwort zweimal?
Syntax-Fehler - ist jetzt behoben. Vielen Dank für diesen Hinweis. Der eigentliche code versucht, hinzufügen ein "a" und dann "b" - variable.

InformationsquelleAutor | 2013-07-30

Schreibe einen Kommentar