プロジェクトをDatabase-FirstからCode-Firstに移行したいと考えています。この作業では、Visual Studioのデータベースジェネレータからコードファーストを使用しました。私は、連結されたPKとFKを持ついくつかのテーブルを持っています。私は単純な "ID"に変更することはできません。なぜなら、これを必要とするレガシーアプリケーションがあるからです。 EFバージョンは6.1.3です
私のプログラムを起動すると、次のエラーが表示されます。
(RechNr、RechPosNr、CompanyID)からテーブルtblRechnungPosition(RechNr、CompanyID、PosNr)への外部キー制約 'tblRechnungPosition_tblAngebReches' ::マッピングが不十分である(1568,10):エラー3015:行1568,1583から始まるマッピングフラグメントの問題::テーブルtblAngebRech外部キーは、概念上の外部キー関連付けに参加するいくつかのAssociationSetまたはEntitySetsにマップされなければならない。
私は何が原因でエラーが発生しているのか理解できません。すべての関係が正しいようです。
ここにクラスがあります:
public partial class tblAngebRech
{
[Key]
[Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int AngebotID { get; set; }
[Key]
[Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int AngebPosNr { get; set; }
[Key]
[Column(Order = 2)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int RechNr { get; set; }
[Key]
[Column(Order = 3)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int RechPosNr { get; set; }
[Key]
[Column(Order = 4)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CompanyID { get; set; }
public DateTime Timestamp { get; set; }
public virtual tblAngebotPosition tblAngebotPosition { get; set; }
public virtual tblRechnungPosition tblRechnungPosition { get; set; }
}
。
public partial class tblRechnungPosition
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public tblRechnungPosition()
{
tblAngebReches = new HashSet<tblAngebRech>();
tblBeauftReches = new HashSet<tblBeauftRech>();
tblRechPosMitarbs = new HashSet<tblRechPosMitarb>();
}
[Key]
[Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int RechNr { get; set; }
[Key]
[Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CompanyID { get; set; }
[Key]
[Column(Order = 2)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int PosNr { get; set; }
public int PosTypID { get; set; }
public int? StdKeyID { get; set; }
public double Menge { get; set; }
public double Betrag { get; set; }
[Required]
[StringLength(100)]
public string Bezeichnung { get; set; }
public DateTime Timestamp { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<tblAngebRech> tblAngebReches { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<tblBeauftRech> tblBeauftReches { get; set; }
public virtual tblPositionstyp tblPositionstyp { get; set; }
public virtual tblRechnung tblRechnung { get; set; }
public virtual tblStundenKey tblStundenKey { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<tblRechPosMitarb> tblRechPosMitarbs { get; set; }
これはprotected override void OnModelCreating(DbModelBuilder modelBuilder)
からprotected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Entity<tblRechnungPosition>()
.HasMany(e => e.tblAngebReches)
.WithRequired(e => e.tblRechnungPosition)
.HasForeignKey(e => new { e.RechNr, e.CompanyID, e.RechPosNr });
どんな助けもありがとう。
モデルビルダのFKプロパティの順序を手動で調整します。
modelBuilder.Entity<tblRechnungPosition>()
.HasMany(e => e.tblAngebReches)
.WithRequired(e => e.tblRechnungPosition)
.HasForeignKey(e => new { e.RechNr, e.RechPosNr, e.CompanyID });
私はcodeplexのEF 6.xチームにバグの問題を送った。ここにリンクがあります: https : //entityframework.codeplex.com/workitem/2947
それが動作しない場合。クラスtblRechnungPositionの列属性の注文番号を次のように変更してください。
[Key]
[Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int RechNr { get; set; }
[Key]
[Column(Order = 2)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CompanyID { get; set; }
[Key]
[Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int PosNr { get; set; }
注:複合外部キーがあります。両方のテーブルクラスで、 [Columns(Order = <order number>)]
内でプロパティの順序が同じでなければなりません。