Нарушено ограничение множественности VS 2010 / SQL Server / EF - PullRequest
2 голосов
/ 19 марта 2012

Я новичок в MVC / C # и пытаюсь работать над небольшим проектом, используя код EF-first, который включает в себя следующие 4 класса: Office, Role, User и OfficeUser.

Проблема в том, что я пытаюсь использовать тот же класс Role между User (определите основной RoleId FK Role.RoleId) и OfficeUser (определите OfficeRoleId для конкретного офисного FK для Role.RoleId), а также User и OfficeUser имеют свои собственные отношения.

Поэтому я пытаюсь написать свое разрешение, используя 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);
         }
     }

Я получаю следующую ошибку

Нарушено ограничение множественности. Роль '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; }
}

1 Ответ

2 голосов
/ 19 марта 2012

Это может произойти, если вы не указали никакой конфигурации для сопоставления отношений между пользователем и офисом.Вот пример класса конфигурации

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 следующим образом.А также добавьте виртуальное ключевое слово в свойство 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);
        }
    }

EDIT

, объявите OfficeRoleId как

public int? OfficeRoleId { get; set; }

Когда вы запрашиваетеOfficeUser, вы можете использовать метод ниже, чтобы использовать отложенную загрузку

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

надеюсь, вы понимаете синтаксис С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...