2016-05-13 1 views
0

У меня есть следующие модели:рамки Entity создания новых записей из навигационных свойств

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

И Im ударяя следующую конечную точку:

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

С этими данными:

{ 
"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 
    } 
    ] 
} 

Вместо ссылки на ранее существовавшие пользовательские объекты Entity Framework создает новые пользовательские объекты:

{ 
    "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 
    } 
    ] 
} 

Не уверен, что неправильно делаю навигационные свойства. Отношения между разговором и пользователем должны быть многими.

ответ

0

Да, это ожидаемое поведение. EF попытается вставить любой объект, который вы добавили (напрямую или через свойство навигации), ЕСЛИ этот объект уже привязан к диаграмме отслеживания. В этом случае вместо этого будет добавлена ​​соответствующая строка таблицы FK или таблицы ссылок.

Что вы хотите сделать, это позвонить db.Users.Attach(user) на каждого из пользователей, которых вы уже знаете, в базе данных. Это должно дать вам ожидаемое поведение (например, добавление строки ссылок вместо вставки новой строки пользователя)

+0

О, я вижу, спасибо! –