2017-04-04 10 views
2

を含む複合主キーを設定する私は、次のように定義されたエンティティのカーブとポイントの間に1対多の関係を持っている:どのように外部キー(EF流暢API)

public class Curve 
{ 
    public Curve() 
    { 
     Points = new HashSet<Point>(); 
    } 

    public int CurveId { get; set; } 

    public string Name { get; set; } 

    public virtual ICollection<Point> Points { get; set; } 
} 

そして:

私のコンテキストクラスで
public class Point 
{ 
    public int Point_Num { get; set; } 

    public int CurveId { get; set; } 

    public double XCoord { get; set; } 

    public double YCoord { get; set; } 

    public virtual Curve Curve { get; set; } 
} 

次のように、私は(ポイントエンティティは複合主キーを持っていることに注意してください)キーとナビゲーションプロパティを設定します。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

    modelBuilder.Entity<Curve>() 
     .HasKey(c => c.CurveId); 

    modelBuilder.Entity<Point>() 
     .HasKey(p => new { p.Point_Num, p.CurveId }); 

    modelBuilder.Entity<Point>() 
     .HasRequired(p => p.Curve) 
     .WithMany(c => c.Points) 
     .HasForeignKey(p => p.CurveId); 

} 
「エントリを更新中にエラーが発生しました。」

var curve = new Curve 
{ 
    Name = "curve 1" 
}; 

var points = new List<Point>(); 
points.Add(new Point 
{ 
    XCoord = 1d, 
    YCoord = 1d, 
}); 

points.Add(new Point 
{ 
    XCoord = 2d, 
    YCoord = 2d, 
}); 

foreach (var point in points) 
{ 
    curve.Points.Add(point); 
} 

using (var dbCtxt = new MyDbContext()) 
{ 
    try 
    { 
     dbCtxt.Curves.Add(curve); 
     dbCtxt.SaveChanges(); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.StackTrace); 
    } 
} 

はエラーがのSaveChanges()が呼び出されたときにスローされます

どこか他のコードでは、私は、データベースを作成します

ポイントエンティティの主キーとしてPoint_Numを定義すると、すべてのエンティティが正常に更新されます。複合プライマリキー(Point_Num、CurveId)に外部キー(CurveId)が含まれているという事実が原因であるようです。

私はこのことを頭にすることはできません。どんな助けでも大歓迎です!

答えて

1

だから私は(「データベースから最初のコード」を使用して)SQLで私のテーブルを作成し、C#で、私のエンティティを生成するエンティティデータモデルウィザードを使用している、私は最初の場所で行われているはず何やった

はそう、私はEFが複合主キーで次の「DatabaseGeneratedOption.None」データ注釈をポイントエンティティを生成していることに気づい:私は流暢APIを使用して、これをimpelemented

public partial class Points 
{ 
    [Key] 
    [Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Point_Num { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Curve_Id { get; set; } 

    ... 

    public virtual Curve Curve { get; set; } 
} 

modelBuilder.Entity<Point>().Property(p => p.PointId) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
データベースを移入するコードのビットで

は、私が作成する2つの異なる「曲線」の実体は、言う:

 var curve1 = new Curve 
     { 
      Name = "curve 1" 
     }; 

     var curve2 = new Curve 
     { 
      Name = "curve 2" 
     }; 

私はその後、PointIdとCurveIdを指定して「ポイント」エンティティを作成します。例えば。のは、私は各曲線に一点を追加したいとしましょう:

var points = new List<Point>(); 

points.Add(new Point 
{ 
    PointId = 1, 
    CurveId = 1, 
    XCoord = 1.2d, 
    YCoord = 3.1d, 
}); 

points.Add(new Point 
{ 
    PointId = 1, 
    CurveId = 2, 
    XCoord = 0.5d, 
    YCoord = 0.75d, 
}); 

コンテキストにエンティティを追加するとき、それはcurve1とcurve2を追加するのに十分ではありませんが、私も以前に作成したポイントのリストを追加する必要があり、EF

myContext.Points.AddRange(points); 
myContext.Curves.Add(curve1); 
myContext.Curves.Add(curve2); 
myContext.SaveChanges(); 

これはまったく優雅な解決策ではありません。私は、これを行うより簡単な方法があることを望んでいたが、それは私の問題を解決した!データベースが正しく更新され、すべてのキーと外部キーが正しく設定されています...

関連する問題