У меня есть модель моего контента:
class BaseModel {
public virtual string Content{ get; set; }
// ...
}
Для отображения данных только модель выше. Но я хочу добавить функциональность для редактирования содержимого. Поэтому мне нужно добавить атрибут к члену content. Но это должно произойти только тогда, когда автор нажимает кнопку редактирования, а не на обычный просмотр содержимого.
Итак, я создал вторую модель, которая наследуется от BaseModel, чтобы я мог переопределить элемент с моим атрибутом:
class EditableBaseModel : BaseModel {
[UIHint("MyEditor"), AllowHtml]
public override string Content{ get; set; }
}
Это отлично работает, но из-за наследования EF создайте дополнительный столбец дискриминатор. Он содержит тип класса как строку. В моем случае это всегда BaseModel, потому что я всегда конвертирую EditableBaseModel в BaseModel, прежде чем он будет сохранен в базе данных следующим образом:
myBbContextInstance.BaseModels.Add(editableBaseModelInstance as EditableBaseModel);
Таким образом, столбец-дискриминатор является пустой тратой пространства, и я хочу удалить его. Я узнал, что это можно сделать с помощью атрибута NotMapped. Но это приведет к следующему исключению, когда я попытаюсь сохранить модель:
Информация об отображении и метаданных не найдена для EntityType 'EditableBaseModel'.
Кажется, что атрибут NotMapped позволит EF знать, что существует другой класс, который наследуется от BaseModel, но EF не получит никакой информации об этом классе. Но это не то, что я хочу. Мне нужно сказать EF: EditableBaseModel - это ничего, о чем он должен заботиться, потому что он только подходит для моего представления и никогда не будет использоваться для базы данных.
Как я могу это сделать? Единственный способ, которым я узнал, - это преобразовать экземпляр EditableBaseModel вручную в объект BaseModel, например:
public ActionResult Save(EditableBaseModel editableBaseModel) {
var baseModel = new BaseModel() {
Content = editableBaseModel.Content
// ...
};
myDbContextInstance.BaseModels.Add(baseModel);
}
Но это не очень хороший способ сделать это, потому что у меня есть атрибуты множественности. И это также не очень гибко, потому что, когда я добавляю что-то в BaseModel, я должен добавить его и здесь - что может привести к странным ошибкам.