簡體   English   中英

非靜態外鍵 EF 核心

[英]Non-static foreign key EF core

我正在開發一個信使 API,它會像不和諧一樣有人向另一個用戶發送好友請求,如果用戶接受,他們就會開始消息傳遞。 如您所知,每個FriendRequest有兩個聯系人,發送者和接收者,有兩種方法可以實現這種關系,一種方法是在FriendRequest和聯系人之間定義多對多關系,並將FriendRequest的聯系人限制為兩個。 另一種方法是在FriendRequest中定義兩個屬性, SenderContactReceiverContact

我選擇了第二種方式,每個FriendRequest應該有兩個外鍵和兩個聯系人。 但是 EF 自動添加了另一個外鍵。 我只想知道兩件事
1:我選擇的第二種方式是好方式嗎? 有沒有更好的方法來實現這種情況?
2:我可以阻止 EF 創建ContactId列嗎?

MyConext 中的 OnModelCreating:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<Contact>().HasMany<FriendRequest>().WithOne(f => f.FromContact);
    builder.Entity<Contact>().HasMany<FriendRequest>().WithOne(f => f.ToContact);
    base.OnModelCreating(builder);
}

好友請求:

public class FriendRequest
{
    public int Id { get; set; }
    public Contact FromContact { get; set; }
    public Contact ToContact { get; set; }
    public string Text { get; set; }
}

接觸:

public class Contact
{
    [Key]
    public int Id { get; set; }
    public int UserId { get; set; }
    public string Username { get; set; }
    public ICollection<Chat> Chats { get; set; }
    public ICollection<FriendRequest> FriendRequests { get; set; }
    public ICollection<Contact> Friends { get; set; }
}

我的數據庫圖

你的方法對我來說似乎沒問題,但你有一個配置錯誤。 您的聯系對象應該是

public class Contact
{
    [Key]
    public int Id { get; set; }
    public int UserId { get; set; }
    public string Username { get; set; }
    public ICollection<Chat> Chats { get; set; }
    public ICollection<FriendRequest> SentFriendRequests { get; set; }
    public ICollection<FriendRequest> ReceivedFriendRequests { get; set; }
    public ICollection<Contact> Friends { get; set; }
}

FriendRequest 可以保持不變,但建議定義一個外鍵

public class FriendRequest
{
    public int Id { get; set; }
    public Contact FromContact { get; set; }
    public Contact ToContact { get; set; }
    public string Text { get; set; }
}

和配置

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Contact>()
          .HasMany<FriendRequest>(c => c.SentFriendRequests)
          .WithOne(f => f.FromContact);

        builder.Entity<Contact>()
          .HasMany<FriendRequest>(c => c.ReceivedFriendRequests)
          .WithOne(f => f.ToContact);

        base.OnModelCreating(builder);
    }

在配置關系時,我總是會再次查看MS 文檔,我建議您這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM