多重性约束首先违反了VS 2010/SQL Server/EF代码



我是MVC/C#的新手,尝试先使用EF代码处理一个小项目,该项目包括以下4个类:OfficeRoleUserOfficeUser

问题是我试图在User(定义主RoleId FK Role.RoleId)和OfficeUser(定义特定办公室FK的OfficeRoleId到Role.RoleId)之间使用相同的Role类,而且UserOfficeUser有自己的关系。

因此,我尝试使用AuthorizeAttribute编写授权,当特定用户登录网站时,我需要获得该用户的角色。当我执行获取时

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);
         }
     }

我得到以下错误

违反了多重性约束。角色"User_OfficeUsers_Target"关系"Inventory.Repository.User_OfficeUsers"的多重数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; }
}

如果您没有放置任何配置来映射User和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类中的Role属性

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);

希望你理解语法问候

最新更新