Я пытаюсь попрактиковаться в проектировании базы данных и сначала использую код 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 ссылается на одного пользователя и множество лайков, которые затем ссылаются на одного пользователя.