2016-05-05 9 views
-1

まず、EF 6.1コードを使用してアプリケーションを構築しています。エンティティモデルは、次のクラスが含まれています Entity Framwork 6コードでNull可能な一対多関係を作成する方法

public enum UnitSystem { 
    English, 
    Metric 
} 

public enum UnitTypes { 
    Volume, 
    Weight, 
    Other 
} 

public class Unit { 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key] 
    public int UnitId { get; set; } 

    [Required, MaxLength(128), Index(IsUnique = true)] 
    public string UnitName { get; set; } 

    [Required] 
    public UnitSystem UnitSystem { get; set; } 

    [Required] 
    public UnitTypes UnitType { get; set; } 

    public virtual ICollection<Item> Items { get; set; } 
} 

public class Item { 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key] 
    public int ItemId { get; set; } 

    [Required, MaxLength(128), Index(IsUnique = true)] 
    public string ItemName { get; set; 

    [Required] 
    public int UnitId { get; set; } 

    [ForeignKey("UnitId")] 
    public virtual Unit Units { get; set; } 

    /// Other unimportant properties 
} 

public class UnitConversion { 

    [Required, Key, Column(Order = 0)] 
    public int FromUnitId { get; set; } 

    [ForeignKey("FromUnitId")] 
    public virtual Unit FromUnit { get; set; } 

    [Required, Key, Column(Order = 1)] 
    public int ToUnitId { get; set; } 

    [ForeignKey("ToUnitId")] 
    public virtual Unit ToUnit { get; set; } 

    [Key, Column(Order = 2)] 
    public int? ItemId { get; set; } 

    public virtual Item Item { get; set; } 

    [Required] 
    public double ConversionFactor { get; set; } 
} 

EFはデータベースを構築

が、私は「紹介FOREIGN KEY制約」というメッセージが表示されます。私は ItemIdプロパティをnull可能にする必要があり、nullでない場合は、それを Itemsテーブルの外部キーにする必要があります。

カスケード削除エラーを回避するためにこの関係を作成する正しい方法は何ですか?

編集

私はもはやItemId列にエラーを取得していませんよ。今はFromUnitIdまたはToUnitIdのいずれかの列、またはその両方を取得しています。

私はUnitクラスにナビゲーションプロパティを追加しました:

[ForeignKey("FromUnitId")] 
public virtual ICollection<UnitConversion> FromConversions { get; set; } 

[ForeignKey("ToUnitId")] 
public virtual ICollection<UnitConversion> ToConversions { get; set; } 

そして、これは私が取得エラーメッセージの全文です:

は、FOREIGN KEY制約「を紹介FK_dbo.UnitConversions_dbo .Units_ToUnitId '' UnitConversions 'テーブルでサイクルまたは複数のカスケードパスが発生することがあります。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。

UnitConversionsテーブルとUnitsテーブルの間には、1対1の関係が想定されています。​​への呼び出しを作成しようとすると、IntelliSenseはWillCascadeOnDeleteメソッドを表示せず、コードはコンパイルされません。

+1

あなたは 'UnitConversion'の' ItemId'について話していますか? '[Key]'属性を '[ForeignKey]'にしたいのであれば、それを置かないでください –

+0

そうです。その場合、その列を含むインデックスがあることを確認するにはどうすればよいですか? –

+0

この問題については、多くの質問があります。正確な流暢なマッピングを見つけるのは難しいことではありません。 –

答えて

0

最初に、entityframeworktutorialのクイックリードを実行して、提案どおりにキーが設定されていることを確認することをおすすめします。 1対1の関係の場合、それはややこしいことです。基本的に '子'の主キーは '親'の外部キーです。

またあなたはデータコンテキストに流暢なAPIを使用すると予想されるような関係とカスケードが行くことを確認するために、このような何かを行うことができます。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Entity<Student>().HasOptional(e => e.StudentAddress) 
      .WithRequired(m => m.Student); 

     modelBuilder.Entity<StudentAddress>.WillCascadeOnDelete(false); 

    } 

これは、学生がオプションStudentAddressを持っている、とStudentAddress言いますStudentAddressが削除された場合、Studentは必須ではありません。

関連する問題