2015-11-18 3 views
1

Я видел несколько примеров на этом сайте для сопоставления нескольких внешних ключей в одной таблице с сущностью. Я думаю, что я кодировал вещи так, как они показаны на примерах, но когда я пытаюсь сохранить свою сущность, оба внешних ключа указывают на одну и ту же сущность, а не на две отдельные. Я ожидаю, что мой родительский объект будет ссылаться на два разных объекта из связанной таблицы. Мои следующие классы:Entity Framework Несколько внешних ключей в одной таблице неверно сопоставлены

public class User: PersistentEntity 
{ 
    [Required] 
    public string FullName { get; set; } 
    [Required] 
    public string HID { get; set; } 
    [Required] 
    public string VID { get; set; } 
    [Required] 
    [MaxLength(100)] 
    public string UserName { get; set; } 

    //nav properties 
    [InverseProperty("ImpersonatedUser")] 
    public virtual ICollection<UserOverride> ImpersonatedUsers { get; set; } 
    [InverseProperty("User")] 
    public virtual ICollection<UserOverride> Users { get; set; } 
} 

public class UserOverride: PersistentEntity 
{ 
    [Required] 
    [ForeignKey("User")] 
    public int UserId { get; set; } 
    [Required] 
    [ForeignKey("ImpersonatedUser")] 
    public int ImpersonatedUserId { get; set; } 
    [Required] 
    public bool Active { get; set; } 

    //nav fields 
    [IgnoreForValidation] 
    [ForeignKey("UserId")] 
    public virtual User User { get; set; } 
    [IgnoreForValidation] 
    [ForeignKey("ImpersonatedUserId")] 
    public virtual User ImpersonatedUser { get; set; } 
} 

создать несколько пользователей без каких-либо ImpersonatedUser объектов на них, а затем попытаться создать новый объект пользователя с одним из этих предыдущих пользователей, установленных в качестве ImpersonatedUser. Я устанавливаю ImpersonatedUserId равным UserId от этого пользователя и добавляю этот объект в список ImpersonatedUsers для пользователя, но когда я пытаюсь сохранить его, он изменяет ImpersonatedUserId на идентификатор нового пользователя, который я сохраняю, и добавляет тот же самый пользователя в список пользователей на объекте User. Если я попытаюсь установить весь объект ImpersonatedUseer и затем сохранить, я получаю сообщение об ошибке, когда множественность внешних ключей не правильна.

Мой вопрос: что я делаю неправильно? это похоже на то, что я видел в качестве других примеров здесь, но я не могу заставить его работать правильно. Правильно ли я смоделировал его? Спасибо за любую помощь.

EDIT ---

 //create a couple users 
     var user = new User 
     { 
      FullName = "Ritchie Blackmore", 
      HID = "01010101", 
      VID = "rblackmore", 
      UserName = "rblackmore" 
     }; 
     var userResult = UserService.SaveOrUpdate(user); 

вот как я создаю мой пользователь Я пытаюсь сохранить:

 var impersonatedUsers = UserService.FindByReadOnly(u => u.UserName.Equals("rblackmore")); 
     var impersonatedUser = Queryable.FirstOrDefault(impersonatedUsers); 


var user = new User 
     { 
      FullName = "Ronnie James Dio2", 
      HID = "03030303", 
      VID = "rjdio2", 
      UserName = "rjdio2", 
      Roles = new List<Role> 
      { 
       roleResult1.Entity, //pre-existing role 
       //TODO: the following are new roles, added while adding the user 
       //probably shouldn't allow this scenario, but it might come in handy 
       new Role 
       { 
        Name = "Client2", 
        Description = "Client", 
        DisplayName = "Client" 
       }, 
       new Role 
       { 
        Name = "Developer2", 
        Description = "Developer", 
        DisplayName = "Developer" 

       } 
      }, 
      ImpersonatedUsers = new List<UserOverride> 
      { 
       new UserOverride {ImpersonatedUserId = impersonatedUser.Id, SystemId = system.Id, Active = true} 
      } 
     }; 
     var result = UserService.SaveOrUpdate(user); 

Как вы можете видеть, я только установив идентификатор олицетворяемых пользователь, а не весь выданный пользовательский объект. Я также попытался назначить весь объект, который вызвал исключение, поскольку он пытался изменить ключ объекта на ключ нового пользователя.

+0

Можем ли мы видеть код, создающий пользователей? – Nate

+0

Да, как вы добавляете свой userOverride к своему пользовательскому объекту, а также, какова цель всего этого? –

+0

Смотрите мои правки выше. Цель состоит в том, чтобы позволить пользователю приложения, которое мы пишем, для эмуляции запуска приложения как другого пользователя, тем самым наследуя все его разрешения в приложении. В основном используется для отладки – MungDrool

ответ

0

Вы пытались просто установить идентификатор и оставить свойства навигации в одиночку? В основном, когда вы говорите:

я устанавливаю ImpersonatedUserId равной UserId от этого пользователя и добавить эту организацию в список ImpersonatedUsers на пользователе.

Оставьте вторую часть (после и) и просто установите Идентификатор пользователя в собственности ImpersonatedUserId. Это должно создать правильные отношения.

Дайте мне знать, как все прошло.

+0

Смотрите мои правки выше. Это то, что я пробовал в первую очередь, но он назначает текущий пользовательский объект олицетворенному пользовательскому свойству. Он изменяет ImpersonatedUserId, который я назначил пользователем UserId нового пользователя, который он только что сохранил. Другими словами, я назначаю ImpersonatedUserId = 1, cal save, но когда он вернется, ImpersonatedUserId = 3 или независимо от идентификатора нового пользователя – MungDrool

Смежные вопросы