EF 4功能CTP 4 - 将多对多关联

时间:2010-08-23 20:46:19

标签: entity-framework entity-framework-4 poco

我使用的是EF 4 Feature CTP 4。

我有以下数据库架构:

[用户] 1-M [UserRoles] M-1 [角色]

我有一个用户和角色类(两个POCO)。

当我尝试将现有角色与用户关联时,会在Roles表中插入新记录,而不是仅在UserRoles中插入新记录。

所以说我有用户1并希望与角色2关联。当我尝试保存时,我最终在角色中创建一个名为“Role 2”的新记录,其中UserRoles中的记录为新创建的角色。从下面的代码中,我期待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 :(得分:0)

尝试在SaveUser方法中使用context.DetectChanges()。它应该工作,因为您正在使用相同的上下文来加载和保存实体图。