Сопоставление кода первой коллекции Entity Framework - FriendRequests - PullRequest
4 голосов
/ 27 марта 2012

Мне нужно отобразить отношение многие ко многим, используя Entity Framework Code First. Это стандартное отображение FriendRequests в социальных сетях. Пользовательский объект имеет коллекцию FriendRequests типа List<User>. В базе данных я использую таблицу соединений для отношений следующим образом:

CREATE TABLE dbo.FriendRequests(
  UserId INT NOT NULL FOREIGN KEY REFERENCES dbo.Users(id),
  FriendId INT NOT NULL FOREIGN KEY REFERENCES dbo.Users(id),
  RequestDate SMALLDATETIME NOT NULL DEFAULT GETUTCDATE())
GO
ALTER TABLE dbo.FriendRequests ADD PRIMARY KEY (UserId,FriendId) 
GO

Как мне сопоставить объект пользователя в Entity Framework Code First, чтобы включить коллекцию через объединяющую таблицу?

1 Ответ

2 голосов
/ 27 марта 2012

Вы можете попробовать это следующим образом:

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

    public ICollection<FriendRequest> FriendRequests { get; set; }
}

public class FriendRequest
{
    public int UserId { get; set; }
    public int FriendId { get; set; }

    public DateTime RequestDate { get; set; }

    public User User { get; set; }
    public User Friend { get; set; }
}

Отображение с помощью Fluent API:

modelBuilder.Entity<User>()
    .HasMany(u => u.FriendRequests)
    .WithRequired(f => f.User)
    .HasForeignKey(f => f.UserId);

modelBuilder.Entity<FriendRequest>()
    .HasKey(f => new { f.UserId, f.FriendId });

modelBuilder.Entity<FriendRequest>()
    .HasRequired(f => f.Friend)
    .WithMany()
    .HasForeignKey(f => f.FriendId);

Из-за свойства RequestDate в таблице ссылок вы не можете отобразить это какотношения многие ко многим.Вместо этого вам нужны два отношения «один ко многим», как показано выше.

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

Изменить

К вашему комментарию: Если вы удалите *В столбце 1017 * вы можете создать свою модель с отношением «многие ко многим».В этом случае вам не нужен объект FriendRequest:

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

    public ICollection<User> FriendRequests { get; set; }
}

Отображение с помощью Fluent API:

modelBuilder.Entity<User>()
    .HasMany(u => u.FriendRequests)
    .WithMany()
    .Map(m =>
    {
        m.ToTable("FriendRequests");
        m.MapLeftKey("UserId");
        m.MapRightKey("FriendId");
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...