2

我是新来的MVC/C#,并试图使用一个小项目工作EF代码优先,其中包括以下4类:OfficeRoleUserOfficeUser多重约束/ SQL服务器/ EF代码优先

问题是,我想使用User(定义主角色ID FK Role.RoleId)和OfficeUser之间相同Role类(定义OfficeRoleId特定办公室FK到Role.RoleId),也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); 
     } 
    } 

我获得以下错误

多重约束侵犯。关系'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; } 
} 
+0

除了多重删除路径问题,我无法重现错误。 – Eranga 2012-03-19 00:45:20

回答

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


    } 

EDIT

尝试删除数据注释 “[ForeignKey的(” 角色“)] “,然后按如下方式将配置添加到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您可以使用下面的方法来使用延迟loading

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

hop e您了解语法 Regards

+0

谢谢Jayanga,它使用你的代码“modelBuilder.Entity ().HasMany(user => user.OfficeUsers).WithOptional(officeuser => officeuser.User).HasForeignKey(officeuser => officeuser.UserId);”但现在我得到这个错误“多重性与角色'OfficeUser_Role_Target'中的关系'OfficeUser_Role'中的参照约束相冲突。因为所有属性都是不可空的,所以主体角色的多重性必须是'1'。使用modelb.Entity ()。HasOptional(c => c.Role).WithMany(p => p.OfficeUsers).HasForeignKey(c => c.OfficeRoleId);我可以帮忙吗? – hjp 2012-03-22 03:13:54

+0

编辑答案检查它,并让我知道 – Jayanga 2012-03-22 04:21:09

+0

感谢您的帮助,我试过了,它仍然给我这个错误“多重性与角色'Role_OfficeUsers_Source'中的参照约束冲突'Role_OfficeUsers'中的冲突因为所有的属性依赖角色不可空,主角色的多重性必须为'1'。“ modelBuilder.Entity ().HasMany(role => role.OfficeUsers).WithOptional(officeuser => officeuser.Role)。 HasForeignKey(officeuser => officeuser.OfficeRoleId); – hjp 2012-03-22 04:34:32