ich ein Modell meines Inhalt haben:ASP.NET EF entfernen Diskriminator Spalte von nicht abgebildet Klasse
class BaseModel {
public virtual string Content{ get; set; }
// ...
}
die Daten anzuzeigen nur das Modell oben in Ordnung ist. Aber ich möchte die Funktionalität hinzufügen, um den Inhalt zu bearbeiten. Also muss ich dem Mitglied Inhalt ein Attribut hinzufügen - Aber das sollte nur passieren, wenn der Autor eine Bearbeitungsschaltfläche drücken, nicht in der regulären Ansicht des Inhalts.
Also habe ich ein zweites Modell, das von der Basemodel erbt so, dass ich das Mitglied mit meinem Attribut überschreiben können:
class EditableBaseModel : BaseModel {
[UIHint("MyEditor"), AllowHtml]
public override string Content{ get; set; }
}
Dies funktioniert gut, aber wegen der Erbschaft EF schaffen eine zusätzliche Spalte Diskriminator. Es enthält den Typ der Klasse als String. In meinem Fall ist es immer Basemodel, weil ich immer konvertieren EditableBaseModel zu Basemodel bevor es wird auf die Datenbank wie folgt gespeichert:
myBbContextInstance.BaseModels.Add(editableBaseModelInstance as EditableBaseModel);
Somit ist die Unterscheidungs-Säule ist eine Verschwendung von Speicherplatz und ich möchte es zu entfernen. Ich fand heraus, dass dies getan werden kann using the NotMapped-attribute. Dies führt jedoch zu folgender Ausnahme, wenn ich versuche, das Modell zu speichern:
Mapping- und Metadateninformationen wurden für EntityType 'EditableBaseModel' nicht gefunden.
Es scheint, dass die NotMapped-Attribut EF wissen lassen, dass eine andere Klasse, die erbt von Basemodel existiert, aber EF keine Informationen über diese Klasse erhalten. Aber das ist nicht was ich will. Ich muss sagen, EF: EditableBaseModel ist nichts, das es interessieren sollte, weil es nur zu meiner Ansicht passen, und würde nie für die Datenbank verwendet werden.
Wie kann ich das tun? Der einzige Weg, fand ich heraus, ist die EditableBaseModel Instanz manuell auf einen Basemodel Objekt wie folgt zu konvertieren:
public ActionResult Save(EditableBaseModel editableBaseModel) {
var baseModel = new BaseModel() {
Content = editableBaseModel.Content
// ...
};
myDbContextInstance.BaseModels.Add(baseModel);
}
Aber das scheint kein guter Weg, das zu tun, weil ich multiplice Attribute. Und es ist auch nicht sehr flexibel, denn wenn ich etwas zum BaseModel hinzufüge, muss ich es auch hier hinzufügen - was zu seltsamen Fehlern führen kann.
Warum fügen Sie dem BaseModel nicht einfach ein nicht zugeordnetes boolesches Feld hinzu, das anzeigt, dass der Benutzer den Inhalt ändern möchte? –
Weil ich das Attribut ** UIHint ** verwende, um Teilansichten wie die aus meinem Editor einzufügen. Es scheint, dass es keine Möglichkeit gibt, dieses Attribut zur Laufzeit zu setzen. – Lion
Attribute sind pro Klasse, nicht pro Instanz. Meiner Meinung nach könnten Sie eine Bedingung in einer Teilansicht verwenden, die basierend auf einem Flag-Feld Bearbeitungssteuerelemente ein- oder ausblenden würde. –