繁体   English   中英

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

[英]Entity Framework Multiple Foreign Keys on same table not mapping correctly

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

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,并添加了相同的名称用户到用户对象上的用户列表。 如果我尝试设置整个ImpersonatedUseer对象,然后保存,则会收到有关多个外键不正确的错误。

我的问题是,我在做什么错? 这看起来像我在这里看到的其他示例一样,但是我无法使其正常工作。 我是否正确建模? 谢谢你的帮助。

编辑 - -

        //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,而不是整个模拟用户对象的ID。 我也尝试分配整个对象,这引发异常,因为它试图将对象的键更改为新用户的键。

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

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

保留第二部分(和之后),然后在ImpersonatedUserId属性中设置用户ID。 那应该建立正确的关系。

让我知道情况如何。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM