Лучший способ использовать наследование в EF Core - PullRequest
0 голосов
/ 10 апреля 2020

Итак, я пытаюсь создать простое приложение для чата.

У меня есть класс User, который реализует IdentityUser:

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

У меня также есть Receiver и Sender, которые присущи из Пользователь:

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; }
}

Это мои DbSets:

    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?

Спасибо!

1 Ответ

1 голос
/ 10 апреля 2020

Это сомнительный вопрос, но я бы добавил таблицу компоновщиков Conversation между Users.

Conversation может содержать все Messages, а Message может иметь ссылку на того пользователя, который его разместил.

Так что 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;}
   //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...