2017-03-23 2 views
1

Hallo, ich habe ein Problem mit EF Core Insert Entity. Das Problem ist, dass ich eine neue Entität in Relation zu einer anderen einfügen muss, die bereits existiert. Ich habe die Beziehungen mit flüssiger API erstellt. Ich habe das schon zweimal gemacht. Zuerst bin die Schaffung ich Auto und das Hinzufügen der zuletzt durch Feld mit Identität Benutzer und alle Werke bearbeitet, aber wenn ich versuche, das gleiche mit einem anderen Unternehmen zu tun, stürzt es mitEF Core verfolgt die Entität nicht korrekt

Mein fließend APi Code unten, das funktioniert gut:

builder.Entity<Car>() 
      .HasOne(x => x.Owner) 
      .WithMany(x => x.OwnerCars) 
      .HasForeignKey(x => x.OwnerId); 
hier

ist Auto Einheit:

public class Car : CarBase 
{ 
    [Key] 
    public int CarId { get; set; } 
    public bool IsTrailer { get; set; } 
    public virtual TrailerType TrailerType { get; set; } 
    public virtual int? TrailerTypeId { get; set; } 
    public virtual ApplicationUser Owner { get; set; } 
    public virtual string OwnerId { get; set; } 
} 

und hier ist die Anwendung Benutzereinheit

public class ApplicationUser : IdentityUser 
{ 
    [MaxLength(100)] 
    public string Address { get; set; } 
    public DateTime CreatedDateTime { get; set; } 
    public DateTime LastEditationDateTime { get; set; } 
    public virtual ApplicationUser LastEditedBy { get; set; } 
    public bool IsDeleted { get; set; } 
    public virtual DateTime DeletedDateTime { get; set; } 
    public ICollection<DriverLicenseApplicationUser> DriverLicenses { get; set; } 
    public ICollection<RideApplicationUser> Rides { get; set; } 
    public ICollection<Car> OwnerCars { get; set; } 
    public ICollection<Car> EditedCars { get; set; } 
    public ICollection<Trailer> EditedTrailers { get; set; } 
    public ICollection<Customer> EditedCustomers { get; set; } 

} 

Um diese Entity hinzuzufügen, rufe ich nur diese Funktion und alle funktioniert.

public Car CreateCar(Car car) 
    { 
     _context.Cars.Add(car); 
     return car; 
    } 

Aber wenn ich auf diese Weise diesen anderen Entitätstyp speichern möchte, wird ein Fehler angezeigt. Alle Schritte sind gleich, also verstehe ich das nicht. Hier füge ich den Code hinzu, mit dem ich das mache.

builder.Entity<Trailer>() 
      .HasOne(x => x.TrailerType) 
      .WithMany(x => x.Trailers) 
      .HasForeignKey(x => x.TrailerTypeId); 

Hier Trailer:

public class Trailer : CarBase 
{ 
    [Key] 
    public int TrailerId { get; set; } 
    //[Required] 
    public virtual TrailerType TrailerType { get; set; } 
    public virtual int TrailerTypeId { get; set; } 
} 

und hier ist traylerTyper:

public class TrailerType:Trackable 
{ 
    //[Key] 
    public int TrailerTypeId { get; set; } 
    [MaxLength(100)] 
    [Required] 
    public string Type { get; set; } 
    public string Note { get; set; } 
    public ICollection<Car> TrailerTypeCars { get; set; } 
    public ICollection<Trailer> Trailers{ get; set; } 
} 

und das Verfahren ist das gleiche wie derjenige bereits erwähnt

public Trailer CreateTrailer(Trailer trailer) 
    { 
     trailer.TrailerTypeId = trailer.TrailerType.TrailerTypeId; 

     //_context.Attach(trailer.TrailerType); 
     var result = _context.Trailers.Add(trailer); 
     return result.Entity; 
    } 

Als ich Kommentieren Sie den Anhang, es funktioniert BU t Ich denke, dass ich das nicht anhängen muss, weil ich die Beziehung basierend auf IDs habe und das erwähnte Beispiel zuerst großartig funktioniert. Es gibt mir keinen Sinn. Wenn also jemand mir einen Rat geben könnte, wäre das großartig.

Hier ist der Fehler Ich erhalte:

Cannot insert explicit value for identity column in table 'TrailerTypes' when IDENTITY_INSERT is set to OFF. 

Es ist wie das EF doesnt sieht, dass die traylertype Einheit existiert bereits und versucht, die gleiche Einheit wieder, und die App abstürzt einzufügen, weil es bereits vorhanden ist und Ich erlaube nicht, IDs direkt einzufügen. Wie gesagt, ich habe absolut keine Ahnung, warum das passiert.

Antwort

0

Das Problem ist Lazy loading. Property von ViewModel ist nicht ganz dasselbe wie Property in Database und EF verfolgt den gesamten Graph der Eigenschaft in Objekt und erkennt nicht, dass es sich um dasselbe Objekt handelt. Die Lösung besteht darin, nur mit IDs anstatt mit ganzen Objekten zu arbeiten.