2011-05-12 11 views
4
class First 
{ 
    [Key] 
    public int Id { get; set; } 
} 

class Second 
{ 
    [Key] 
    public int Id { get; set; } 

    public int? First_Id { get; set; } 

    [ForeignKey("First_Id")] 
    public First First { get; set; } 
} 

public class SecondMapping : EntityTypeConfiguration<Second> 
{ 
    public SecondMapping() 
     : base() 
    { 
     this.HasOptional(s => s.First) 
      .With ... ??? 
    } 
} 

第2は、第1への参照を有するかもしれない。しかし、まずはSecondへの言及はありません。 Entity Framework 4.1でこのマッピングを適用できますか?エンティティフレームワーク0..1から0の関係

EDIT:第二は、(使用属性のいくつかの種類に依存)最初の1つのインスタンスが含まれている可能性が

this.HasOptional(s => s.First) 
    .WithOptionalDependent() 
    .WillCascadeOnDelete(false); 

は以前、それが私の解決策でした。最初にSecondのインスタンスは含まれません。

答えて

10

外部キーも依存エンティティの主キーである場合にのみ、一対一の関係が可能です。だから、正しいマッピングは次のとおりです。

class First 
{ 
    [Key] 
    public int Id { get; set; } 
} 

class Second 
{ 
    [Key, ForeignKey("First")] 
    public int Id { get; set; } 
    public First First { get; set; } 
} 

理由は、それがSecondエンティティ内で一意である必要があり、データベースの外部キーで1対1の関係を強化することです。しかし、エンティティ・フレームワークは一意のキーをサポートしていません.EFの唯一の一意の値は主キーです。これはEFの制限です。

Morteza Manavi's blogで回避方法が説明されています。回避策は、カスタムデータベース初期化子にユニークな制約を導入することによって、1対多の関連付けをマッピングし、データベースの一意性を強制することに基づいています。

+0

EF言語:リレーションの反対側のナビゲーションプロパティを持たないオプションのリレーションシップですか? – 0xbadf00d

+0

PK-PKにFKを配置した後は、オプションでオプションにすることはできません。同じPK値を持つ主体が必要なためです。 –

+0

自分の投稿を編集して、問題をより詳しく説明しました。注意してください。 – 0xbadf00d

0

あなたはFirstエンティティに関連する最も唯一のSecondエンティティであり1対1の関係を、達成しようとしている場合、そして何の逆プロパティが存在しないところ以下のことを試してください。

class First 
{ 
    [Key] 
    public Guid FirstId { get; set; } 
} 

class Second 
{ 
    [Key] 
    public Guid FirstId { get; set; } 
    public First First { get; set; } 
} 

class SecondMapping : EntityTypeConfiguration<Second> 
{ 
    public SecondMapping() 
    { 
     this.HasRequired(s => s.First); 
    } 
} 

しかし、別のFirst_id列を使用してこのような関連付けを行うことはできますが、効果的に1対Nの関係を作成できます。 UNIQUE制約を経由して1対1であることを「強制」することができますが、(ラディスラフが述べたように)あなたはEFに制限による逆資産を作成することができません。で話

class SecondMapping : EntityTypeConfiguration<Second> 
{ 
    public SecondMapping() 
    { 
     this.HasRequired(s => s.First).WithMany().HasForeignKey("First_id"); 
    } 
} 
+0

上記のLadislav Mrnkasのコメントに私のコメントを書き留めてください。 – 0xbadf00d

関連する問題