2016-04-13 38 views
1

Ich bin in EF wirklich neu, und ich bin suddenyl mit einem Problem stecken:Entity Framework Spalten-Entity-Korrelation?

 var _entity = new TestEntity(); 

     _entity.Customers.Add(new Customers { Description = "John" }); 
     _entity.Customers.Add(new Customers { Customer_ID = 1, Description = "Steve" }); 

     try 
     { 
      _entity.SaveChanges(); 
     } 
     catch (System.Data.Entity.Validation.DbEntityValidationException) 
     { 
      Debug.Print("Validation Error"); 
     } 

Nach diesem Code ausgeführt wird, habe ich ein Ergebnis habe, die ohne Ausnahme zwei Aufzeichnungen insterted, aber mein Problem ist, Das Customer_ID-Feld lässt keine Null zu und definiert keinen Standardwert. Allerdings hat "John" -record mit Customer_ID eingefügt: 0. (Und natürlich, "Steve" -record auch, mit der richtigen ID: 1)

Wie kann ich es schaffen, eine Aussicht zu werfen, oder zumindest vor dem Einfügen von Werten tiefer validieren, und wenn nicht durch Code definiert, nicht einfügen?

Die Modellklasse ist hier:

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

    [Column(Order = 1)] 
    [StringLength(50)] 
    public string Description { get; set; } 

Danke

Antwort

1

Der Standardwert für int 0, die nicht null ist, und Sie waren in der Lage, es zu DB einzufügen. Wenn Sie überprüfen möchten, ob Customer_ID einem höheren Wert als 0 zugewiesen wurde, können Sie das Attribut Range ausprobieren.

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[Range(1, Int32.MaxValue, ErrorMessage = "Value for {0} must be larger than 0.")] 
public int Customer_ID { get; set; } 

Eine weitere hässliche Lösung könnte die Eigenschaft Typ int? und Anwenden des Required Attribut zu ändern, wie dies Markierung:

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[Required] 
public int? Customer_ID { get; set; } 
+0

@GertArnold Dank für die Korrektur –

-1

Es ist nicht klar, ob Sie für Customer_ID wollen null akzeptieren oder nicht? public int Kundennummer {get; einstellen; } hat den Standardwert von 0, also was Sie bekommen, ist richtig.

wenn erforderlich Versuch:

[Required] 
public int Customer_ID { get; set; } 

wenn es null sein

public int? Customer_ID { get; set; } 
+0

Okay, in der Tabellendefinition von SQL-Seite, ist Customer_ID erlaubt nicht null. In meinem Code definiere ich nicht den Wert für John-Record, also bedeutet es - aus meiner Sicht - ich gebe keinen Wert für Customer_ID, daher sollte es standardmäßig null sein, und eine Ausnahme bekommen, dass Pass auf, du definierst keinen Wert für die ID. – user1692315

+1

Gut in C# haben Sie eine Eigenschaft Customer_ID vom Typ int und dies bedeutet, dass der Standardwert von Customer_ID 0 ist. Also mit anderen Worten, wenn Sie in db NULL sehen wollen, müssen Sie einen Nullable Typ als property ex: public int? Kunden-ID {erhalten; einstellen; }. Und dann haben die neuen Zeilen null. – Catalin

+0

Sie müssen danach eine neue Zeile hinzufügen, damit es funktioniert. – Catalin

1

Okay, ich habe es.

Also sollte ich den Wert als Nullable-Zeichen:

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public int? Customer_ID { get; set; } 

Und in diesem Fall, ich habe gerade einen DbUpdateException. Vielleicht eine Lösung, aber vielleicht nicht die beste, also sind andere Vorschläge immer noch willkommen.

+1

Das mache ich. –

1

Auf der Datenbank Seite, ich so sehr empfehlen eine CHECK-Einschränkung auf Customer_ID setzen, dass sie dies nicht 0. erlaubt aus undichten in die Datenbank Fehler in der Anwendung zu verhindern.