2016-02-21 2 views
1

Я пытаюсь сохранить Список пользователей в классе Разговора, но я получаю InvalidCastException при выполнении POST.InvalidCastException при использовании Entity Framework

Это мой класс User:

public class User 
{ 
    [Key] 
    [DataMember] 
    public String Email { get; set; } 

    [DataMember] 
    public String Password { get; set; } 

    [DataMember] 
    public Boolean Admin { get; set; } 

    public User(String email, String password, Boolean admin) 
    { 
     Email = email; 
     Password = password; 
     Admin = admin; 
    } 
} 

И это мой разговор класс:

[DataContract] 
public class Conversation 
{ 
    [Key] 
    [DataMember] 
    public string Key { get; set; } 
    [DataMember] 
    public string ConversationName { get; set; } 
    [DataMember] 
    public string Administrator { get; set; } 
    [DataMember] 
    [ForeignKey("Email")] 
    public List<User> Members { get; set; } 

    public Conversation(string key, string name, string admin, List<User> members) 
    { 
     Key = key; 
     ConversationName = name; 
     Administrator = admin; 
     Members = members; 
    } 

    public Conversation() 
    { 

    } 
} 

Это контроллер Диалог:

POST:

[HttpPost] 
    public async Task<IHttpActionResult> PostConversation(Conversation convo) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     foreach (var user in convo.Members) 
     { 
      db.Entry(user).State = EntityState.Unchanged; 
     } 

     db.Conversations.Add(convo); 
     await db.SaveChangesAsync(); 

     return CreatedAtRoute("DefaultApi", new { name = convo.Key }, convo); 
    } 

GET:

[HttpGet] 
public IQueryable<Conversation> GetConversations() 
{ 
    return db.Conversations; 
} 

EDIT Сообщение заявление:

{ 
"Key": "123", 
"ConversationName": "Test", 
"Administrator": "Ken", 
"Members": [{"Email": "[email protected]","Password" : "Passw-1", "Admin" : "true"}, 
      {"Email": "[email protected]","Password" : "Passw-1", "Admin" : "false"}] 
} 

Ошибка я получаю:

"ExceptionMessage": «Не удалось привести объект типа«System.Collections. Generic.List`1 [AcademicAssistant.Models.User] 'для ввода «AcademicAssistant.Models.User».,

+0

Почему вы вызываете 'db.Conversations.Add' дважды? Кроме того, есть ли у вас больше информации о том, где произошла ошибка, или если вы даете какие-либо сведения о том, какое свойство является неправильным. – Steve

+0

У вас есть 3 требуемых параметра в вашем пользовательском конструкторе (адрес электронной почты, пароль и админ). Если вы не отправляете по электронной почте, паролю и администраторам каждого участника в разговоре, он не сможет создавать ваши пользовательские объекты для каждого члена. Поскольку я не вижу, что вы на самом деле публикуете, я не могу быть уверен, но я сомневаюсь, что вы отправляете пароли для пользователей в разговоре. – randyh22

+0

@Steve спасибо, что указали, что это была ошибка! Это свойство «членов», которое дает проблемы. Я редактировал вопрос, чтобы включить дополнительную информацию! – semiColon

ответ

1

Ваша модель неверна. Как у вас есть N: N отношения между Conversation и User вам нужно удалить ForeingKey атрибут из разговора, прежде чем Members, и вам нужно добавить ICollection<Conversation> Conversation свойство в классе пользователя, или идти дальше и настроить отношения, как вам нужно с FluentApi

Смежные вопросы