【问题标题】:EF 4 Feature CTP 4 - Associate Many to ManyEF 4 功能 CTP 4 - 多对多关联
【发布时间】:2010-08-23 20:46:19
【问题描述】:

我正在使用 EF 4 Feature CTP 4。

我有以下数据库架构:

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

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

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

假设我有用户 1 并想与角色 2 关联。当我尝试保存时,我最终在角色中获得了一条名为“角色 2”的新记录,其中用户角色中的记录与新创建的角色有关。从下面的代码中,我期望 UserRoles 中只有一条新记录,其中包含用户和角色之间的映射。

这是我的 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);
        }

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 即使在我暴露了 DetectChanges(不在 dbContext 中)之后也没有用
    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    相关资源
    最近更新 更多