I have a problem with LinqConnect when try to add and remove rows in the EntitySet. My Oracle database contains three tables (let's say User-UserRole-Role):
R(User)={ID(PK), Name}
R(Role) = {ID(PK), Name}
R(UserRole) = {UserID(PK/FK), RoleID(PK/FK), Description}
I have a WPF app, where i'm trying to give a user UI for editig UserRole data through the DataGrid control. For that purpose a have two commands: for add new row to UserRoles collection and remove one. In the very simplify way:
Code: Select all
public class ViewModel
{
User User {get;set;}
public AddUserRole(Role role)
{
if (user.UserRoles.Any(x=>x.Role == role)) return;
var newItem = new UserRole(){Role = role};
UserRoles.Add(newItem);
}
public RemoveUserRole(UserRole userRole)
{
if (!UserRoles.Contains(userRole)) return;
UserRoles.Remove(userRole);
}
IBindingList _userRoles;
public IBindingList UserRoles
{
get
{
if (_userRoles == null) _userRoles = user.UserRoles.GetNewBindingList();
return _userRoles;
}
}
}
Code: Select all
[TestMethod()]
void TestInsertRemove()
{
using (var db = new MyDataContext())
{
ViewModel vm = new ViewModel();
vm.User = db.Users.First();
Role role = db.Roles.First();
// Assume UserRoles table is empty - the user has no any roles
Assert.AreEqual(0, vm.User.UserRoles.Count); // OK
vm.AddUserRole(role);
Assert.AreEqual(1, vm.User.UserRoles.Count); // OK
var lastAdded = vm.User.UserRoles.First();
vm.RemoveUserRole(lastAdded);
Assert.AreEqual(0, vm.User.UserRoles.Count); // OK
// Try to add the role again
vm.AddUserRole(role);// Failed with System.InvalidOperationException: Can not insert entity with the same key if key is not database generated.
}
}
Code: Select all
public AddUserRole(Role role)
{
if (user.UserRoles.Any(x=>x.Role == role)) return;
var newItem = new UserRole(){Role = role};
UserRoles.Add(newItem);
db.InsertOnSubmit(newItem); // Assume db is accesible from ViewModel
}
public RemoveUserRole(UserRole userRole)
{
if (!UserRoles.Contains(userRole)) return;
db.DeleteOnSubmit(userRole); // Assume db is accesible from ViewModel
UserRoles.Remove(userRole);
}