簡體   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