まず、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
メソッドを表示せず、コードはコンパイルされません。
あなたは 'UnitConversion'の' ItemId'について話していますか? '[Key]'属性を '[ForeignKey]'にしたいのであれば、それを置かないでください –
そうです。その場合、その列を含むインデックスがあることを確認するにはどうすればよいですか? –
この問題については、多くの質問があります。正確な流暢なマッピングを見つけるのは難しいことではありません。 –