实体框架同一个表上的多个外键未正确映射

时间:2015-11-18 19:58:43

标签: c# entity-framework foreign-keys

我在这个站点上看到了几个将同一个表上的多个外键映射到实体的示例。我想我已经按照它们在示例中的显示方式进行了编码,但是当我尝试保存我的实体时,两个外键都指向同一个实体而不是两个独立的实体。我期待我的父实体将引用链接表中的两个不同实体。我的课程如下:

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对象的用户,然后尝试创建一个新的User对象,其中一个以前的用户设置为ImpersonatedUser。我将ImpersonatedUserId设置为等于该用户的UserId,并将此实体添加到User上的ImpersonatedUsers列表中,但是当我尝试保存时,它将ImpersonatedUserId更改为我正在保存的新用户的id,并添加相同的user到User对象上的Users列表。如果我尝试设置整个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);

如您所见,我只设置模拟用户的ID,而不是整个模拟的用户对象。我也试过分配整个对象,因为它试图将对象的密钥更改为新用户的密钥时抛出异常。

1 个答案:

答案 0 :(得分:0)

您是否尝试过设置ID并单独保留导航属性? 基本上,当你说:

  

我将ImpersonatedUserId设置为等于UserId   用户并将此实体添加到用户的ImpersonatedUsers列表中。

保留第二部分(之后和),并在ImpersonatedUserId属性中设置用户ID。这应该创造正确的关系。

让我知道它是怎么回事。