【问题标题】:Best way to use inheritance in EF Core在 EF Core 中使用继承的最佳方式
【发布时间】:2020-04-09 22:41:07
【问题描述】:

所以我正在尝试构建一个简单的聊天应用程序。

我有一个实现 IdentityUser 的用户类:

public class User : IdentityUser
{
    public IEnumerable<Message> Messages { get; set; }
}

我还有一个来自用户的接收者和发送者:

public class Receiver : User
{

}

public class Sender : User
{

}

最后我有一个班级留言: 一条消息有 1 个发送者和 1 个接收者。

public class Message
{
    public int Id { get; set; }
    public string SenderId { get; set; }
    public string ReceiverId { get; set; }
    public virtual Sender Sender { get; set; }
    public virtual Receiver Receiver { get; set; }
    public string Text { get; set; } 
    public byte[] File { get; set; }
    public DateTime Date { get; set; }
}

这些是我的 DbSet:

    public DbSet<User> Users { get; set; }
    public DbSet<Receiver> Receivers { get; set; }
    public DbSet<Sender> Senders { get; set; }
    public DbSet<Message> Messages { get; set; }

这是我的 OnModelCreating:

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<Message>()
            .HasOne(m => m.Receiver)
            .WithMany(r => r.Messages)
            .HasForeignKey(m => m.ReceiverId);

        builder.Entity<Message>()
            .HasOne(m => m.Sender)
            .WithMany(s => s.Messages)
            .HasForeignKey(m => m.SenderId);
    }

所以我的问题是......有没有更好的方法来实现这些类?有什么办法只能使用 User 类而不是 Receiver 和 Sender 类?

谢谢!

【问题讨论】:

    标签: asp.net entity-framework asp.net-core entity-framework-core


    【解决方案1】:

    这是一个固执己见的问题,但我会在Users 之间添加一个链接器表Conversation

    Conversation 可以包含所有MessagesMessage 可以包含指向发布它的任何用户的链接。

    所以User 不能有任何Messages 没有Conversation

    public class User {
       public string Id {get;set;}
    }
    
    public class Conversation {
       public string SenderId {get;set;}
       public string RecieverId {get;set;}
       public ICollection<Message> Messages {get;set;}
    }
    
    public class Message {
       public string Id {get;set;}
       public string UserId {get;set;}
       //...
    }
    

    【讨论】:

    • 类对话应该有两个用户对象。像这样的东西:public class Conversation { public User Sender {get;set;} public string Reciever {get;set;} public string SenderId {get;set;} public string RecieverId {get;set;} public ICollection&lt;Message&gt; Messages {get;set;} } 这将导致多对多关系。我想到了您的解决方案,但因此没有实施。
    猜你喜欢
    • 2023-02-04
    • 2018-11-18
    • 2022-11-17
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2020-02-10
    相关资源
    最近更新 更多