2016-05-13 10 views
0

Ich habe folgende Modelle:Entity Framework neue Einträge aus Navigationseigenschaften zu schaffen

public class Conversation 
{ 
    public int ConversationId { get; set; } 
    public virtual User Owner { get; set; } 
    public virtual ICollection<User> Users { get; set; } 

} 


public class User 
{ 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Conversation> Conversations { get; set; } 
} 

Und Im den folgenden Endpunkt treffen:

 private DirectAPIContext db = new DirectAPIContext(); 

    [HttpPost] 
    public async Task<Conversation> CreateConversation([FromBody] Conversation conversation) 
    { 
     Conversation newConversation = conversation; 

     db.Conversations.Add(newConversation); 

     await db.SaveChangesAsync(); 

     return newConversation; 
    } 

Mit diesen Daten:

{ 
"ConversationId": 7, 
    "Owner": { 
    "UserId": 27, 
    "Name": null, 
    "Conversations": null 
    }, 
    "Users": [ 
    { 
     "UserId": 28, 
     "Name": null, 
     "Conversations": null 
    }, 
    { 
     "UserId": 29, 
     "Name": null, 
     "Conversations": null 
    }, 
    { 
     "UserId": 30, 
     "Name": null, 
     "Conversations": null 
    } 
    ] 
} 

Statt Referenzieren der vorhandenen Benutzerobjekte Entity Framework erstellt neue Benutzerobjekte wie folgt:

{ 
    "ConversationId": 7, 
    "Owner": { 
    "UserId": 27, 
    "Name": null, 
    "Conversations": null 
    }, 
    "Users": [ 
    { 
     "UserId": 28, 
     "Name": null, 
     "Conversations": null 
    }, 
    { 
     "UserId": 29, 
     "Name": null, 
     "Conversations": null 
    }, 
    { 
     "UserId": 30, 
     "Name": null, 
     "Conversations": null 
    } 
    ] 
} 

Ich bin nicht sicher, ob ich Navigationseigenschaften falsch mache. Die Beziehung zwischen Konversation und Benutzer sollte viele zu viele sein.

Antwort

0

Ja das ist das erwartete Verhalten. EF wird versuchen, jedes Objekt hinzuzufügen, das Sie hinzugefügt haben (entweder direkt oder über eine Navigationseigenschaft), sofern dieses Objekt nicht bereits an das Tracking-Diagramm angehängt ist. In diesem Fall wird stattdessen eine relevante FK- oder Link-Tabellenzeile hinzugefügt.

Was Sie tun möchten, ist db.Users.Attach(user) auf jedem der Benutzer, die Sie bereits in der Datenbank sind bekannt zu rufen. Dies sollte Ihnen das erwartete Verhalten geben (z. B. Hinzufügen einer Linkzeile anstelle des Einfügens einer neuen Benutzerzeile)

+0

Oh ich sehe, danke! –