DbModel Entity Framework: Как сопоставить отношения один ко многим, используя таблицу соединений? - PullRequest
3 голосов
/ 15 февраля 2011

Я пытаюсь отобразить через DbModel эту связь, присутствующую в базе данных.

CREATE TABLE core.Institutes 
(
    ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    Name NVARCHAR(128) NOT NULL,
    OldID INT NULL
)
GO

CREATE TABLE core.InstitutePlaces
(
    FKInstituteID INT NOT NULL PRIMARY KEY REFERENCES core.Institutes(ID),
    FKPlaceID INT NOT NULL REFERENCES core.Places(ID)
)
GO

CREATE TABLE core.Places
(
    ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    Name NVARCHAR(128) NOT NULL,
    FKParentID INT NULL REFERENCES core.Places(ID),
    OldID INT NULL
)
GO

в этой модели

public class Place
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public Place Parent { get; set; }
}

public class Institute
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Place Place { get; set; }
}

мы используем что-то подобное для сопоставления

modelBuilder.Entity<Institutes.Institute>().HasOptional(i => i.Place);

, но он не работает: (

Этот сценарий прекрасно управляется файлом EDML, поэтому проблема заключается только в отображении.

1 Ответ

3 голосов
/ 17 февраля 2011

Нечто подобное даст вам (почти) желаемую схему с одним предупреждением: Code First не создает отношения 1: 1 в сценариях разделения сущностей, которыми является желаемая схема (создание ассоциации 1: * с использованием таблицы соединения)частный случай этого.

public class Place
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public Place Parent { get; set; }
}

public class Institute
{
    [DatabaseGenerated(DatabaseGenerationOption.None)]
    public int Id { get; set; }
    public string Name { get; set; }

    public int? PlaceId { get; set; }
    public Place Place { get; set; }
}

public class Context : DbContext
{
    public DbSet<Place> Places { get; set; }
    public DbSet<Institute> Institutes { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Institute>().Map(mc =>
        {
            mc.Properties(p => new { p.Id, p.Name });
            mc.ToTable("Institutes");
        })
        .Map(mc =>
        {
            mc.Properties(p => new { p.Id, p.PlaceId });
            mc.ToTable("InstitutePlaces");
        });

        modelBuilder.Entity<Place>()
                    .HasOptional(p => p.Parent)
                    .WithMany()
                    .HasForeignKey(p => p.ParentId);
    }
}

Мне пришлось отключить создание идентификатора из-за ошибки, которую я объяснил здесь .

...