2016-08-09 16 views
2

Als Erstes, bitte markieren Sie dies nicht als Duplikat. Ich weiß, dass es mehrmals berührt wurde, aber ich glaube, dass meine Situation anders ist. Ich mache einen Code-First-Ansatz, bei dem die Datenbank im Wesentlichen bereits in einigen existiert.Code First mit vorhandener Datenbank, Entity Framework: Kann keinen expliziten Wert für die Identitätsspalte in der Tabelle einfügen, wenn IDENTITY_INSERT auf OFF gesetzt ist

Wenn ich DbContext.SaveChanges() aufrufen, erhalte ich die folgende Fehlermeldung: "Expliziter Wert für die Identitätsspalte kann nicht in die Tabelle 'CustomerShippingConfiguration' eingefügt werden, wenn IDENTITY_INSERT auf OFF gesetzt ist". Wie Sie unten im generierten SQL sehen können, versucht Entity Framework, 0 in die Id-Spalte für einen neuen Datensatz einzufügen.

INSERT [dbo].[CustomerShippingConfiguration]([Id], [CustomerId], [AverageCartonWeight], [AverageCartonsPerPallet], [CreatedBy], [Created], [UpdatedBy], [Updated]) 
VALUES (@0, @1, @2, @3, @4, @5, @6, @7) 

-- @0: '0' (Type = Int32) 

-- @1: '119' (Type = Int32) 

-- @2: '11' (Type = Decimal, Precision = 18, Scale = 2) 

-- @3: '11' (Type = Int32) 

-- @4: '616' (Type = Int32) 

-- @5: '8/9/2016 10:09:08 AM' (Type = DateTime) 

-- @6: '616' (Type = Int32) 

-- @7: '8/9/2016 10:09:08 AM' (Type = DateTime) 

Diese ID-Spalte ist vom Typ INT und wird als Identitätsspalte, Primärschlüssel und automatische Inkremente eingerichtet.

Identity Column Configuration

Identity Column Specification

Table Schema

Das Entity-Modell sieht wie folgt aus:

public class ShippingConfigurationEntity : EntityBase<ShippingConfigurationEntity>, IEntity 
{ 
     public int CustomerId { get; set; } 

     public virtual CustomerEntity Customer { get; set; } 

     public decimal? AverageCartonWeight { get; set; } 

     public int? AverageCartonsPerPallet { get; set; } 

     public virtual ICollection<ShippingAddressEntity> Addresses { get; set; } 

     public ShippingConfigurationEntity() 
     { 
      Addresses = new List<ShippingAddressEntity>(); 
     } 
} 

public abstract class EntityBase<T> 
{ 
     public virtual int Id { get; set; } 

     public virtual int CreatedBy { get; set; } 

     public virtual DateTime Created { get; set; } 

     public virtual int UpdatedBy { get; set; } 

     public virtual DateTime Updated { get; set; } 
} 

Und die Konfiguration für das Unternehmen wie folgt aussieht:

public class ShippingConfigurationConfiguration : EntityTypeConfiguration<ShippingConfigurationEntity> 
{ 
    public ShippingConfigurationConfiguration() 
    { 
     HasKey(t => t.Id); 

     Property(t => t.CustomerId).IsRequired(); 
     Property(t => t.AverageCartonsPerPallet).IsOptional(); 
     Property(t => t.AverageCartonWeight).IsOptional(); 
     Property(t => t.CreatedBy).IsRequired(); 
     Property(t => t.Created).IsRequired(); 
     Property(t => t.UpdatedBy).IsRequired(); 
     Property(t => t.Updated).IsRequired(); 

     ToTable("CustomerShippingConfiguration"); 

     HasMany(x => x.Addresses).WithRequired(x => x.ShippingConfiguration).HasForeignKey(x => x.ShippingConfigurationId).WillCascadeOnDelete(); 
    } 
} 

Es gibt eine übergeordnete Entität namens Kunde, der in etwa so aussieht:

public class CustomerEntity : EntityBase<CustomerEntity>, IEntity 
{ 
    public int LocationID { get; set; }   

    public virtual ShippingConfigurationEntity ShippingConfiguration { get; set; } 
} 

Wo die Konfiguration wie folgt aussieht:

class CustomerConfiguration : EntityTypeConfiguration<CustomerEntity> 
{ 
    public CustomerConfiguration() 
    { 
     HasKey(t => t.Id); 

     Property(t => t.LocationID).IsRequired(); 

     Ignore(t => t.Created); 
     Ignore(t => t.CreatedBy); 
     Ignore(t => t.Updated); 
     Ignore(t => t.UpdatedBy); 

     ToTable("Customer"); 

     Property(t => t.Id).HasColumnName("ID"); 
     Property(t => t.LocationID).HasColumnName("LOCATION_ID"); 

     HasOptional(x => x.ShippingConfiguration).WithRequired(x => x.Customer).WillCascadeOnDelete(); 
    } 
} 

Wenn ich entfernen Sie die Beziehung zwischen CustomerEntity und ShippingConfiguration Entity, every wenn Ich verwende folgendes für die Id-Eigenschaft auf ShippingConfiguration:

Ich habe ein anderes Wesen, das in einem sehr ähnlichen Muster aufgebaut ist, das gut funktioniert. Ich bin hier wirklich ratlos. Vielen Dank im Voraus für jeden Hinweis.

+0

Keine Antwort, aber was ist der Punkt von "EntityBase" mit einem generischen Parameter, der nicht verwendet wird? – DavidG

+0

Ehrlich gesagt, es ist Erbe und muss entfernt werden. Es diente einem Zweck, aber nicht mehr. –

+0

Haha, schön genug. In diesem Fall sollten Sie sich bewusst sein, dass das Schreiben einer [mcve] Ihre Frage wahrscheinlich viel schneller und mit weniger dummen Fragen beantwortet, wie meine :) – DavidG

Antwort

0

Sie müssen Ihrer Konfiguration mitteilen, dass die Datenbank die Schlüsselgenerierung verarbeiten wird.

using System.ComponentModel.DataAnnotations.Schema; 

public class ShippingConfigurationConfiguration : EntityTypeConfiguration<ShippingConfigurationEntity> 
{ 
    public ShippingConfigurationConfiguration() 
    { 
     HasKey(t => t.Id); 

     Property(a => a.Id) 
      .IsRequired() 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    } 
} 
+0

Ich habe das versucht, aber vielleicht nicht mit der IsRequired. Ich glaube, es hat einen weiteren Fehler verursacht. Lass es mich versuchen und ich poste zurück. Das Seltsame ist, dass ich das mit meinen anderen Entitäten nicht machen muss. Es ist, als würde EF einfach davon ausgehen, dass es sich um eine Datenbank handelt, die standardmäßig generiert wird. –

+0

Dies erzeugt "Eine abhängige Eigenschaft in einer ReferentialConstraint wird einer speichergenerierten Spalte zugeordnet. Spalte: 'Id'."Das ist verwirrend, weil ich ziemlich stark fühle, dass die obige Beziehung für die Adressen definiert ist. Wie ich bereits erwähnt habe, ist dieses Muster für mich nicht neu. –

+0

Das funktioniert jetzt, wenn ich die Beziehung zwischen dieser und der übergeordneten Entität entferne. Siehe die Änderungen in meiner ursprünglichen Frage. –

Verwandte Themen