多重性约束首先违反了VS 2010/SQL Server/EF代码
本文关键字:2010 SQL Server 代码 EF VS 约束 多重性 | 更新日期: 2023-09-27 18:28:16
我是MVC/C#的新手,尝试先使用EF代码处理一个小项目,该项目包括以下4个类:Office
、Role
、User
和OfficeUser
。
问题是我试图在User
(定义主RoleId FK Role.RoleId)和OfficeUser
(定义特定办公室FK的OfficeRoleId到Role.RoleId)之间使用相同的Role
类,而且User
和OfficeUser
有自己的关系。
因此,我尝试使用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);
希望你理解语法问候