【问题标题】:Entity Framework Multiple Foreign Keys on same table not mapping correctly同一表上的实体框架多个外键未正确映射
【发布时间】:2015-11-19 05:05:09
【问题描述】:

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

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 并将此实体添加到 User 上的 ImpersonatedUsers 列表中,但是当我尝试保存时,它会将 ImpersonatedUserId 更改为我正在保存的新用户的 id,并添加相同的用户到用户对象上的用户列表。如果我尝试设置整个 ImpersonatedUser 对象然后保存,则会收到关于外键多重性不正确的错误。

我的问题是,我做错了什么?这看起来就像我在这里看到的其他示例一样,但我无法让它正常工作。我的模型是否正确?感谢您的帮助。

编辑---

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

【问题讨论】:

  • 我们能看到创建用户的代码吗?
  • 是的,你如何将你的 userOverride 添加到你的用户对象中,还有,这一切的目标是什么?
  • 查看我上面的编辑。目标是允许我们正在编写的应用程序的用户模拟以不同用户身份运行应用程序,从而继承他在应用程序中的所有权限。主要用于调试
  • 您只能设置ImpersonatedUser = impersonatedUser不能设置Id
  • 我尝试设置ImpersonatedUser = impersonatedUser,但它在尝试保存时将其更改为当前用户,与我设置id时相同

标签: c# entity-framework foreign-keys


【解决方案1】:

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

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

留下第二部分(and 之后),只需在 ImpersonatedUserId 属性中设置 User 的 Id。这应该建立正确的关系。

告诉我进展如何。

【讨论】:

  • 查看我上面的编辑。这是我首先尝试的,但它将当前用户对象分配给模拟用户属性。它将我分配的 ImpersonatedUserId 更改为它刚刚保存的新用户的 UserId。换句话说,我分配 ImpersonatedUserId = 1,cal 保存,但是当它返回时,ImpersonatedUserId = 3 或任何新用户的 id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多