2011-01-02 7 views
0

Kundenklasse:Neues Objekt einfügen mit real, um neue Objekte mit Identitätsspalte

class Customer 
{ 
    int id; 
    int phone; 
    int fax; 
    PhoneNumber phone1; 
    PhoneNumber fax1; 
} 

Class PhoneNumber 
{ 
int id; 
int prefixid; 
string number; 
} 

Die Phone von EF4 automatisch generiert wurde, habe ich die automatisch generierten Namen zu phone1 ändern und fax1

Sowohl die Telefonnummer als auch die Kundennummer sind Identitätsspalten in der Datenbank.

Jetzt möchte ich einen neuen Kunden schaffen:

 var newCustomer = Customer.CreateCustomer(0, CompanyID); 
     PhoneNumber fax = new PhoneNumber(); 
     PhoneNumber phone = new PhoneNumber(); 

     fax.Customers.Add(newCustomer); 
     phone.Customers.Add(newCustomer); 

     context.Customers.AddObject(newCustomer); 
     context.SaveChanges(); 

Aber jetzt erhalte ich:

System.Data.UpdateException: {"Cannot insert explicit value for identity column in table 'PhoneNumber' when IDENTITY_INSERT is set to OFF."}

Warum ist nicht EF4 befassen sich mit der Identitätsspalte der verknüpften Tabelle, wie sie umgehen sollte mit einer neuen Einheit? Wie kann ich das schaffen?

(EF4 haben 2 entiries in Handys Tabelle erstellen Sollte ihre Identität erhalten und sie an den Kunden Zeile des neuen Kunden hinzufügen - zumindest das, was ich tun will)

Ich weiß, ich kann 2 erstellen Telefon Aufzeichnungen, und dann erstellen Sie den Kunden einen, aber

a. Ich möchte, dass es in einem Akt geschieht.

b. wenn cusotmer Schöpfung versagt - ich will nicht, leere Datensätze auf dem Tisch Telefone ...

Antwort

1

Nun diese beiden Dinge widersprechen einander:

Both phonenumber id and customer id are identity columns in the DB.

Aber dann der Fehler:

System.Data.UpdateException: {"Cannot insert explicit value for identity column in table 'PhoneNumber' when IDENTITY_INSERT is set to OFF."}

Es mag so aussehen, als ob dieser Fehler sagt, dass eine doppelte Identität gesetzt wird, aber es ist nicht - es sagt, dass Sie versuchen, das Identitätsfeld explizit festzulegen.

Das heißt, dass die ID-Spalte in PhoneNumber kein Identitätsfeld ist. Zumindest glaubt EF das nicht.

So habe ich vier Fragen:

1) Haben Sie bestätigten das Feld IDENTITY in der EDMX gesetzt? Vielleicht hat etwas es überschrieben?

2) Was macht die CreateCustomer Methode? Ist es ein neuer Kunde und einige Eigenschaften? Es sollte die Identitätsfelder nicht berühren.

3) Haben Sie die Navigationseigenschaften/Kardinalitäten am EDMX richtig eingestellt? ZB 1 Kunde .. 1- * Telefonnummern.

4) Versuchen Sie, die Telefonnummer dem Kunden hinzuzufügen, nicht umgekehrt. Es macht Sinn, die „viele“ auf die „Eins“ zu addieren - z Kunde ist das Aggregat hier:

var newCustomer = Customer.CreateCustomer(0, CompanyID); 
newCustomer.phone1 = new PhoneNumber(); 
newCustomer.fax1 = new PhoneNumber(); 
context.Customers.AddObject(newCustomer); 
context.SaveChanges(); 

ich auch Ihr Modell würde vorschlagen, neu zu gestalten.

Es ist albern, Kunden mit 1 Fax und 1 Telefonnummer zu haben, jede mit einer Eigenschaft dort. Es sollte ein Kunde sein, der viele "PhoneNumber" -Entitäten hat.

Sie könnten TPH auf der Phone Einheit verwenden, um zwischen Fax und anderen Arten, und der obige Code würde viel mehr Sinn zu unterscheiden: für die Beantwortung

var newCustomer = Customer.CreateCustomer(0, CompanyID); 
newCustomer.Phones.Add(new FaxNumber()); 
newCustomer.Phones.Add(new MobileNumber()); 
context.SaveChanges(); 
+0

Dank. 1. EDMX wurde automatisch generiert. Die Phonennummer ID ist Identität in DB, und es ist nicht auf EDMX - ich versuche es jetzt zu beheben. 2. Diese Methode wurde von VS2010 automatisch generiert. 3. Jeder Kunde hat tatsächlich 4 Telefonnummern. Es hat 4 Navigationseigenschaften, die ich nur ihre Namen änderte. 4. Ich habe das auch gemacht - habe den gleichen Fehler bekommen. Ihr Design ist besser, aber ich möchte, dass jeder Kunde genau 4 Telefonnummern hat, 1 von ihnen ist Fax und 1 ist Zelle - also habe ich eine feste Beziehung (1: 4) und nicht 1: N gemacht. Ich ändere edmx manuell und versuche es erneut (Identität) – Dani

+0

Ich habe PhoneNumber ID geändert, um Identität in EDMX, versuchte beide Möglichkeiten (auch versucht, newCustomer.CellNumber = new PhoneNumber();) und der gleiche Fehler tritt auf. – Dani

+0

OK. Die Telefon-ID wurde in der XML-Datei als Identität geändert (es wurde ein anderer Standort gefunden, der vom Modellbrowser nicht geändert wurde) - und es hat wie erwartet funktioniert !! Danke noch einmal. – Dani

Verwandte Themen