Entity Framework Code First - один-ко-многим с таблицей соединений / ссылок - PullRequest
4 голосов
/ 22 сентября 2011

Можно ли создать отношение «один ко многим» с Code First, в котором между ними используется таблица связей / соединений?

public class Foo {
    public int FooId { get; set; }
    // ...

    public int? BarId { get; set; }
    public virtual Bar Bar { get; set; }
}

public class Bar { 
    public int BarId { get; set; }
    // ...

    public virtual ICollection<Foo> Foos { get; set; }
}

Я хочу отобразить это следующим образом:

TABLE Foo
    FooId INT PRIMARY KEY
    ...

TABLE Bar
    BarId INT PRIMARY KEY

TABLE FooBar
    FooId INT PRIMARY KEY / FOREIGN KEY
    BarId INT FOREIGN KEY

Благодаря этому у меня была бы возможность убедиться, что у Foo есть только один Бар, но этот Бар может быть повторно использован многими различными Foo.

Возможно ли это с Entity Framework?Я бы предпочел не вставлять ключ в сам Foo, потому что я не хочу обнуляемый внешний ключ.Если это возможно, приведите пример, используя Fluent API, а не аннотации данных.

1 Ответ

3 голосов
/ 22 сентября 2011

Вы можете использовать разделение сущностей для достижения этого

public class Foo
{
    public int FooId { get; set; }

    public string Name { get; set; }

    public int BarId { get; set; }

    public virtual Bar Bar { get; set; }
}

Тогда в вашем пользовательском классе DbContext

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Foo>().HasKey(f => f.FooId);
        modelBuilder.Entity<Foo>()
            .Map(m =>
                     {
                         m.Properties(b => new {b.Name});
                         m.ToTable("Foo");
                     })
            .Map(m =>
                     {
                         m.Properties(b => new {b.BarId});
                         m.ToTable("FooBar");
                     });

        modelBuilder.Entity<Foo>().HasRequired(f => f.Bar)
            .WithMany(b => b.Foos)
            .HasForeignKey(f => f.BarId);

        modelBuilder.Entity<Bar>().HasKey(b => b.BarId);
        modelBuilder.Entity<Bar>().ToTable("Bar");
    }

Столбец BarId будет создан как ненулевой столбец в FooBar стол.Вы можете проверить Code First в ADO.NET Entity Framework 4.1 для получения более подробной информации

...