Oracle ODP.Net и EF CodeFirst - ошибка SaveChanges - PullRequest
2 голосов
/ 29 марта 2012

Может ли кто-нибудь помочь мне с этим:

Код:

Role r = new Role { ID = 1, Name = "Members" };
ctx.Roles.Attach(r);

//Saving User
User u = new User {
    Login = login,
    Password = password,
    Status = 1
};
u.Roles.Add(r);

ctx.Users.Add(u);
ctx.SaveChanges();

Я пытаюсь сохранить нового пользователя с существующей ролью.Классы User и Role имеют отношение «многие ко многим», отображаемое fluent-api следующим образом:

modelBuilder.Entity<User>()
.HasMany(u => u.Roles)
.WithMany(r => r.Users)
.Map(x => {
    x.ToTable("USER_ROLE_XREF", dbsch);
    x.MapLeftKey("ID_USER");
    x.MapRightKey("ID_ROLE");
});

Но когда вызывается SaveChanges, я получаю эту ошибку: {"Указанныйзначение не является экземпляром типа 'Edm.Decimal' \ r \ nParameter name: value "}

На самом деле, я всегда пытаюсь сохранить связанные сущности с помощью одного вызова SaveChanges () Iполучите ту же ошибку.Итак, что я должен был сделать, чтобы понять это, это сделать несколько вызовов и так хорошо работает:

Role r = new Role { ID = 1, Name = "Members" };
ctx.Roles.Attach(r);

//Saving User
User u = new User {
    Login = login,
    Password = password,
    Status = 1
};

ctx.Users.Add(u);
ctx.SaveChanges();

//Assigning Member Role
u.Roles.Add(r);
ctx.SaveChanges();

Насколько я понимаю, поддержка EF для сохранения нескольких изменений одним вызовом SaveChanges, так что яинтересно, что здесь не так.

1 Ответ

0 голосов
/ 30 марта 2012

Идея метода Attach() состоит в том, что у вас есть объект, который, как известно, находится в БД, но не отслеживается этим контекстом, верно? Мой вопрос к вам: знаете ли вы, что эта роль здесь:

Role r = new Role { ID = 1, Name = "Members" };

что-то уже существует? Если это не так, я не думаю, что вы хотите сделать, это использовать

ctx.Roles.Attach(r);

скорее, вы бы написали:

ctx.Roles.Add(r);

и тогда вы можете обернуться и написать

User u = new User {
    Login = login,
    Password = password,
    Status = 1,
};

ctx.Users.Add(u);
u.Roles.Add(r);
ctx.SaveChanges();

Проблема, с которой столкнулся ваш первый пример, заключается в том, что эта новая роль действительно нова для БД, поэтому ее присоединение - это не то, что вы хотели бы сделать, а то, что вы хотите добавить ее.

И одиночный вызов ctx.SaveChanges() должен нормально работать.

...