2017-04-04 4 views
2

Ich habe eine Eins-zu-viele konfigurieren Beziehung zwischen Entitäten Curve und Point, wie folgt definiert:Wie man einen zusammengesetzten Primärschlüssel enthält einen Fremdschlüssel (EF Fluent 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; } 
} 

Und:

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; } 
} 

In meinem Kontextklasse, konfiguriere ich die Schlüssel und Navigationseigenschaften wie folgt (beachten Sie, dass die Punkt Unternehmen einen zusammengesetzten Primärschlüssel hat):

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); 

} 

Irgendwo anders im Code, bevölkern ich die Datenbank:

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); 
    } 
} 

ein Fehler ausgelöst wird, wenn Savechanges() aufgerufen wird „Ein Fehler ist aufgetreten, während die Einträge zu aktualisieren.“

Wenn ich Point_Num als Primärschlüssel der Point-Entity definiere, werden alle Entitäten problemlos aktualisiert. Es scheint, als ob das Problem von der Tatsache herrührt, dass der zusammengesetzte Primärschlüssel (Point_Num, CurveId) einen Fremdschlüssel (CurveId) enthält.

Ich kann das nicht verstehen, da ist eindeutig etwas, was mir fehlt. Jede Hilfe wird sehr geschätzt!

Antwort

1

So habe ich getan, was ich in erster Linie getan haben sollte, was meine Tabellen in SQL schafft und die Entity Data Model-Assistenten meine Einheiten in C# generieren (mit „Code zuerst aus der Datenbank“)

Dabei bemerkte ich, dass EF die Zeigereinheit mit den folgenden „DatabaseGeneratedOption.None“ Daten Anmerkungen auf dem zusammengesetzten Primärschlüssel generiert:

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; } 
} 

ich dies mit Fluent API impelemented:

modelBuilder.Entity<Point>().Property(p => p.PointId) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

Im Stück Code, der die Datenbank auffüllt, schaffe ich sagen, 2 verschiedene „Curve“ Entitäten:

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

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

Ich schaffe „Punkt“ Entitäten dann PointID und CurveId angeben. Z.B. Lassen Sie uns sagen, dass ich einen Punkt auf jeder Kurve hinzufügen möchten:

auf den Kontext
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, 
}); 

Beim Hinzufügen von Entitäten, genügt es nicht, die curve1 und Kurve2 hinzuzufügen, muss ich auch die Liste der Punkte hinzufügen, die zuvor EF erstellt, lädt sie nicht automatisch:

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

Es ist keine elegante Lösung überhaupt. Ich hatte gehofft, dass es einen einfacheren Weg geben würde, aber das hat mein Problem gelöst! Die Datenbank wird korrekt aktualisiert, alle Schlüssel und Fremdschlüssel sind ordnungsgemäß eingerichtet ...

Verwandte Themen