EF 4 Feature CTP 4 - ассоциировать многих со многими - PullRequest
2 голосов
/ 24 августа 2010

Я использую EF 4 Feature CTP 4.

У меня есть следующая схема базы данных:

[Пользователи] 1-M [Пользовательские роли] M-1 [Роли]

У меня есть класс User и Role (оба POCO).

Когда я пытаюсь связать существующую роль с пользователем, новая запись вставляется в таблицу Roles вместо того, чтобы вставлять только новую запись в UserRoles.

Скажем, у меня есть Пользователь 1 и я хочу связать его с Ролью 2. Когда я пытаюсь сохранить, я получаю новую запись в Роли с именем «Роль 2» с записью в Пользовательских ролях для вновь созданной роли. Из приведенного ниже кода я ожидал только новую запись в UserRoles с отображением между User и Role.

Вот мои классы POCO, отображение и тестирование.

POCO Классы:

public class User {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public byte[] DataVersion { get; set; }

        private List<Role> roles = new List<Role>();
        public virtual IList<Role> Roles {
            get {
                return roles;
            }
        }   
    }

public class Role {
        public int Id { get; set; }
        public string Name { get; set; }

        public List<User> Users { get; set; }
    }

Отображение:

public class UserConfiguration : EntityConfiguration<Domain.User> {
        public UserConfiguration() {
            this.MapSingleType(user => new {
                UserId = user.Id,
                FirstName = user.FirstName,
                LastName = user.LastName,
                DataVersion = user.DataVersion
            });

            this.Property(u => u.DataVersion).IsConcurrencyToken().HasStoreType("timestamp").StoreGeneratedPattern = StoreGeneratedPattern.Computed;

            //Users <--> Roles
            this.HasMany(u => u.Roles).WithMany(r => r.Users)
                .Map("UserRoles", (u, r) => new {
                    UserId = u.Id,
                    RoleId = r.Id
                });  
        }
   }

public class RoleConfiguration : EntityConfiguration<Domain.Role> {
        public RoleConfiguration() {
            this.MapSingleType(role => new {
                RoleId = role.Id,
                RoleName = role.Name
            });

        }
    }

Тест:

public void AssignRoleTest() {
            var userId = 1;
            User user;

            var userRepo = new UsersRepository();
            user = userRepo.GetUser(userId);

            var roleRepo = new RolesRepository();

            var roleId = 2;
            var role = roleRepo.GetRole(roleId);

            user.Roles.Add(role);

            userRepo.SaveUser(user);

     }

Код для сохранения в хранилище:

public void SaveUser(User user) {
        if (user.Id > 0) {
            dbContext.Users.Attach(user);
            dbContext.MarkAsModified(user);
        }
        else {
            dbContext.Users.Add(user);
        }

1 Ответ

0 голосов
/ 30 августа 2010

Попробуйте использовать context.DetectChanges () в вашем методе SaveUser.Это должно работать, потому что вы используете один и тот же контекст для загрузки и сохранения графа объектов.

...