3

データベースに存在するこの関係を 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 ファイルによって完全に管理されているため、問題はマッピングのみです。

4

1 に答える 1

3

このようなものは、(ほぼ) 目的のスキーマを 1 つの注意点で提供します: 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);
    }
}

ここで説明したバグのため、ID 生成をオフにする必要がありました。

于 2011-02-17T04:07:14.840 に答える