EF CF Настройка сопоставления «многие ко многим» вручную

У меня есть существующая база данных. На данный момент я пытаюсь сначала сопоставить свои новые объекты Entity с этой БД с кодом структуры сущностей. Ниже представлен класс User с коллекцией друзей. Как видите, это отношение «многие ко многим» к одной и той же таблице. Как я могу сопоставить это отношение с таблицей «user_friend», в которой есть столбцы «user_id» и «friend_id».

public class User
{
    private ICollection<User> _friends = new List<User>();
    public ICollection<User> Friends { get{return _firends;} }
}

moduleBuilder.Entity<User>().HasMany????.ToTable("user_friend");

person mynkow    schedule 20.03.2011    source источник


Ответы (1)


Для этого вам нужно перейти к свободному API:

public class User
{
    public int UserId { get; set; }
    public ICollection<User> Friends { get; set; }
}

public class Context : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasMany(u => u.Friends).WithMany().Map(c =>
        {
            c.MapLeftKey(u=>u.UserID, "user_id");
            c.MapRightKey(f=>f.FriendID, "friend_id");
            c.ToTable("user_friend");
        });
    }
}
person Morteza Manavi    schedule 20.03.2011
comment
Спасибо. Это заработало после установки EF RC. Еще один вопрос. Можно ли сопоставить коллекцию друзей с полем. Я хочу открыть свою коллекцию как IEnumerable‹User› или ICollection‹User›{get{return _friends.AsReadOnly();}}, но это невозможно. - person mynkow; 21.03.2011
comment
Без проблем. Что касается вашего вопроса, EF Code First в настоящее время не поддерживает сопоставление с полем, оно должно быть свойством. Если вы сделаете свое свойство доступным только для чтения, Code First просто проигнорирует его. Конечно, вы можете иметь неавтоматическое свойство, определив вспомогательное поле, но Code First всегда будет работать со свойством, а не с полем. - person Morteza Manavi; 21.03.2011