3

我是 MVC/C# 的新手,并尝试使用 EF 代码优先处理一个小项目,其中包括以下 4 个类:Office、和.RoleUserOfficeUser

问题是我试图在(定义 master RoleId FK Role.RoleId )和(将特定办公室 FK 的 OfficeRoleId 定义为Role.RoleId )Role之间使用相同的类,并且有自己的关系。UserOfficeUserUserOfficeUser

所以我正在尝试编写我的授权AuthorizeAttribute,当他/她登录网站时,我需要获取特定用户的角色。当我执行 get

public User GetUserRoleByUserName(string userName, string passWord)
{
   using (var context = DataContext)
   {
      return context.Users.Include("Role")
                          .Include("OfficeUsers")
                          .SingleOrDefault(u => u.UserName == userName && u.Password == passWord);
         }
     }

我收到以下错误

违反了多重性约束。关系“Inventory.Repository.User_OfficeUsers”的角色“User_OfficeUsers_Target”具有多重性 1 或 0..1。

你能告诉我如何解决这个问题吗?

public class Office
{
       public Office()
       {
          OfficeUsers = new HashSet<OfficeUser>();
       }

      public int OfficeId { get; set; }
      public string OfficeName { get; set; }

      public virtual ICollection<OfficeUser> OfficeUsers { get; set; }
}

public class Role 
{
     public Role()
     {
         Users = new HashSet<User>();
         OfficeUsers = new HashSet<OfficeUser>();
     }

     public int RoleId { get; set; }
     public string RoleName { get; set; }
     public string Description { get; set; }

     public virtual ICollection<User> Users { get; set; }
     public virtual ICollection<OfficeUser> OfficeUsers { get; set; }
}

public class User
{
     public User()
     {
         OfficeUsers = new HashSet<OfficeUser>();
     }

     public int UserId { get; set; }
     public string UserName { get; set; }
     public string Password { get; set; }
     public int RoleId { get; set; }

     public virtual ICollection<OfficeUser> OfficeUsers { get; set; }
     public virtual Role Role { get; set; }
}

public class OfficeUser
{
     public OfficeUser()
     {
     }

     public int OfficeUserId { get; set; }
     public int OfficeId { get; set; }
     public int UserId { get; set; }
     [ForeignKey("Role")]
     public int OfficeRoleId { get; set; }
     public bool Active { get; set; }

     public User User { get; set; }
     public Office Office { get; set; }
     public Role Role { get; set; }
}
4

1 回答 1

2

如果您没有进行任何配置来映射用户和 Office 之间的关系,则可能会发生这种情况。这是一个示例配置类

public class UserConfiguration : EntityTypeConfiguration<User>
    {
        public LocationConfiguration()
        {
            HasKey(a => a.Id);
            HasMany(user => user.OfficeUsers).WithOptional(officeuser => officeuser.User).
               HasForeignKey(officeuser => officeuser.UserId);
        }
    }

并将此配置添加到您的上下文中,如下所示

public class YourContext : DbContext
    {

       // your DBSets and contructors, etc


        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new UserConfiguration());            
            base.OnModelCreating(modelBuilder);
        }


    }

编辑

尝试删除数据注释“[ForeignKey("Role")]”,然后将配置添加到 Role 类,如下所示。并且还将虚拟关键字添加到 OfficeUser 类中的角色属性

public class RoleConfiguration : EntityTypeConfiguration<Role>
    {
        public LocationConfiguration()
        {
            HasKey(a => a.RoleId);
            HasMany(role =>role.OfficeUsers).WithOptional(officeuser => officeuser.Role).
               HasForeignKey(officeuser => officeuser.OfficeRoleId);
        }
    }

编辑

将 OfficeRoleId 声明为

public int? OfficeRoleId { get; set; }

当您查询 OfficeUser 时,您可以使用以下方法来使用延迟加载

YourQuery().Include(officeuser => officeuser.Role);

希望你理解语法问候

于 2012-03-19T07:17:12.410 回答