2010-02-02 10 views
14

Ich habe eine Tabelle in meiner Datenbank CompanyDetails. Es hat eine Spalte namens CharacterID varchar(255). Ich habe es gerade von einer NOT NULL Spalte zu einer NULL Spalte geändert. Ich habe den 'Update Model From Database ...'-Befehl sowohl im Modellbrowser als auch im EDMX-Dateibetrachter ausgeführt. Dies ist, was es in dem Designer erstellt:Entity Framework - Update Model from Database ... - keine Aktualisierung passiert!

/// <summary> 
/// There are no comments for Property CharacterId in the schema. 
/// </summary> 
[global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable=false)] 
[global::System.Runtime.Serialization.DataMemberAttribute()] 
public string CharacterId 
{ 
    get 
    { 
     return this._CharacterId; 
    } 
    set 
    { 
     this.OnCharacterIdChanging(value); 
     this.ReportPropertyChanging("CharacterId"); 
     this._CharacterId = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); 
     this.ReportPropertyChanged("CharacterId"); 
     this.OnCharacterIdChanged(); 
    } 
} 
private string _CharacterId; 
partial void OnCharacterIdChanging(string value); 
partial void OnCharacterIdChanged(); 
/// <summary> 
/// There are no comments for Property URLDomain in the schema. 
/// </summary> 
[global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] 
[global::System.Runtime.Serialization.DataMemberAttribute()] 
public string URLDomain 
{ 
    get 
    { 
     return this._URLDomain; 
    } 
    set 
    { 
     this.OnURLDomainChanging(value); 
     this.ReportPropertyChanging("URLDomain"); 
     this._URLDomain = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); 
     this.ReportPropertyChanged("URLDomain"); 
     this.OnURLDomainChanged(); 
    } 
} 
private string _URLDomain; 
partial void OnURLDomainChanging(string value); 
partial void OnURLDomainChanged(); 

Sie werden feststellen, dass es ein Attribut hat:

[global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable=false)] 

Ich habe auch die nächste Eigenschaft, und Sie werden feststellen, dass es richtig als gekennzeichnet:

[global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] 

Was gibt? Wie kann ich einfache Änderungen in meinem DB-Schema vornehmen und das Entity Framework basierend auf diesen Änderungen wirklich auf den neuesten Stand bringen ?! Ich musste das Modell jedes Mal fallen lassen und neu erstellen, wenn sich etwas geändert hat!

Antwort

18

Das Entitätsframework verwendet eine XML-Datei (das edmx), um das Datenbankschema und das Mapping anzugeben. Wenn Sie auf "Modell von Datenbank aktualisieren" klicken, wird diese EDMX-Datei aktualisiert. Wenn Sie Ihre App kompilieren, wird diese edmx-Datei analysiert und die Backing-Klassen, die Sie betrachten, werden generiert. Wenn Sie also die Änderung in den Backing-Klassen sehen möchten, müssen Sie das Modell aktualisieren und dann neu kompilieren.

Schließlich müssen Sie auch daran denken, dass die edmx 3 Dinge enthält.

  1. Die Datenbank/Speicherschema (SSDL)
  2. Das konzeptionelle Modell (CSDL)
  3. Die Zuordnung zwischen konzeptuellen und -Speicherung (MSL)

Aktualisieren der Datenbank und auf "Update" wird Aktualisieren Sie die SSDL, aber die erforderlichen Änderungen werden nicht automatisch am konzeptionellen Modell vorgenommen. Möglicherweise müssen Sie den Designer edmx öffnen und die Eigenschaften auf dem Feld überprüfen. (Es ist durchaus möglich, ein NULL-fähiges Datenbankfeld einem Nicht-NULL-konformen Feld zuzuordnen, aber offensichtlich ist das in diesem Fall nicht das, was Sie wollen).

+0

+1. Dies ist richtig. Wenn Sie in CSDL bereits eine Eigenschaft generiert haben, müssen Sie sie manuell aktualisieren. Aber die SSDL wird immer von Grund auf neu erstellt. Die EF setzt voraus, dass Sie Ihre CSDL-Anpassungen vornehmen möchten. –

+4

Danke Craig. Als zusätzliche Anmerkung glaube ich, dass Sie das Tool edmgen (http://msdn.microsoft.com/en-us/library/bb387165.aspx) mit dem Schalter/mode: FromSSDLGeneration oder/mode: FullGeneration verwenden können, um die Generierung von zu erzwingen die CSDL + MSL oder alle Blöcke, wenn Sie das brauchen. –

+0

Wo finde ich diese 3 Dateien und muss ich sie bei jeder Änderung manuell bearbeiten? Ich habe eine Suche auf meiner Festplatte durchgeführt und kann diese Dateien überhaupt nicht finden, also frage ich mich, ob sie intern erzeugt werden, und wenn ja, wie öffne ich sie? (Was für eine neue Frage!) :) –

Verwandte Themen