Я видел несколько примеров на этом сайте для сопоставления нескольких внешних ключей в одной таблице с сущностью. Я думаю, что я кодировал вещи так, как они показаны на примерах, но когда я пытаюсь сохранить свою сущность, оба внешних ключа указывают на одну и ту же сущность, а не на две отдельные. Я ожидаю, что мой родительский объект будет ссылаться на два разных объекта из связанной таблицы. Мои следующие классы: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);
Как вы можете видеть, я только установив идентификатор олицетворяемых пользователь, а не весь выданный пользовательский объект. Я также попытался назначить весь объект, который вызвал исключение, поскольку он пытался изменить ключ объекта на ключ нового пользователя.
Можем ли мы видеть код, создающий пользователей? – Nate
Да, как вы добавляете свой userOverride к своему пользовательскому объекту, а также, какова цель всего этого? –
Смотрите мои правки выше. Цель состоит в том, чтобы позволить пользователю приложения, которое мы пишем, для эмуляции запуска приложения как другого пользователя, тем самым наследуя все его разрешения в приложении. В основном используется для отладки – MungDrool