Структура EF Core DB - PullRequest
       81

Структура EF Core DB

0 голосов
/ 06 октября 2019

Я пытаюсь попрактиковаться в проектировании базы данных и сначала использую код EF Core. Я хотел сделать простую модель базы данных для сообщений между пользователями. У меня есть 3 таблицы: пользователь, разговор и сообщение.

public class Message 
{
    public Guid Id { get; set; }
    public DateTime DateTimeSend { get; set; }
    public string Content { get; set; }
    public bool IsDeleted { get; set; }

    public Guid ConversationId { get; set; }
    public Conversation Conversation { get; set; }

    public Guid? UserId { get; set; }
    public User User { get; set; }
}

public class Conversation
{
    public Guid Id { get; set; }

    public DateTime DateTimeCreated { get; set; }
    public bool IsDeleted { get; set; } = false;

    public ICollection<Message> Messages { get; set; }
    public ICollection<UserConversation> Users { get; set; }
}

public class User
{
    public Guid Id { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public ICollection<UserConversation> Conversations { get; set; } 
    public ICollection<Message> Messages { get; set; }
}

public class UserConversation
{
    public Guid UserId { get; set; }
    public User User { get; set; }

    public Guid ConversationId { get; set; }
    public Conversation Conversation { get; set; }
}

Я не использую «виртуальные» свойства, так как я хочу контролировать, что и когда загружается (не всегда все необходимо).

Я хочу понять, что и Message, и Conversation ссылаются на таблицу User. Так где должна быть конфигурация? Есть ли правило для места настройки Fluent API?

У таблицы User и Conversation есть отношение «многие ко многим», мне понадобится объединяющая таблица, то есть конфигурация:

public void Configure(EntityTypeBuilder<UserConversation> builder)
{
        builder.ToTable("UserConversations");

        builder.HasKey(b => new { b.UserId, b.ConversationId });

        builder.HasOne(bc => bc.User)
            .WithMany(b => b.Conversations)
            .HasForeignKey(bc => bc.UserId);

        builder.HasOne(bc => bc.Conversation)
            .WithMany(b => b.Users)
            .HasForeignKey(bc => bc.ConversationId);
}

Должен ли я иметь какой-то видOnDelete поведения? Я думаю, нет. Должен ли я иметь аналогичную конфигурацию в таблице пользователей и разговоров?

Как правило, это правильный подход? Подобный случай может понравиться пользователю - три таблицы User, Post (как на фейсбуке) и Like -> У пользователя много лайков, много постов. Каждый пост имеет одного пользователя и много лайков. Таким образом, таблица Post ссылается на одного пользователя и множество лайков, которые затем ссылаются на одного пользователя.

...