2011-02-15 14 views
3

私はデータベース上に存在するこの関係をDbModel経由でマップしようとしています。このモデルのEntity FrameworkのDbModel:接続テーブルを使用して1対多の関係をマップする方法

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

私はあなたのモデルが1から*動作すると考えています。ナビゲーションプロパティはICollectionである必要があります Institutes {get; set;}、遅延読み込みを有効にするには、プロパティを仮想にします。ここにEFCF CPT5の良いブログがあります。http://weblogs.asp.net/manavi/default.aspx – Paul

+0

ありがとうございますが、私たちは、私たちのために意味がないので、場所から研究所へのナビゲーションプロパティを避けたいと思います場所から研究所、またはその特定の場所にリンクされている他のエンティティに移動する。 – Kralizek

答えて

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); 
    } 
} 

私が原因私はhereを説明したバグにアイデンティティの生成をオフにする必要がありました。

+0

あなたの答えに感謝します! エンティティ分割の使用については考えていませんでした。 :) – Kralizek

+0

問題はありません、私はあなたの質問の少なくとも1つに本当の答えを提供することができてうれしいです:) –

関連する問題