私は自分のコンテンツのモデルを持っています:
class BaseModel {
public virtual string Content{ get; set; }
// ...
}
データのみを表示するには、上記のモデルで問題ありません。しかし、コンテンツを編集する機能を追加したいと考えています。したがって、メンバーコンテンツに属性を追加する必要があります-しかし、これは、コンテンツの通常のビューではなく、作成者が編集ボタンを押したときにのみ発生するはずです。
そこで、 BaseModelから継承する 2 番目のモデルを作成して、メンバーを自分の属性でオーバーライドできるようにしました。
class EditableBaseModel : BaseModel {
[UIHint("MyEditor"), AllowHtml]
public override string Content{ get; set; }
}
これは正常に機能しますが、継承のため、EF は追加の column discriminatorを作成します。クラスの型が文字列として含まれています。私の場合、次のようにデータベースに保存される前に、常にEditableBaseModelをBaseModelに変換するため、常にBaseModelです。
myBbContextInstance.BaseModels.Add(editableBaseModelInstance as EditableBaseModel);
したがって、discriminator-column はスペースの無駄であり、削除したいと考えています。これは NotMapped-attribute を使用して実行できることがわかりました。ただし、モデルを保存しようとすると、次の例外が発生します。
EntityType 'EditableBaseModel' のマッピングおよびメタデータ情報が見つかりませんでした。
NotMapped-attribute は、 BaseModel から継承する別のクラスが存在することを EF に知らせるようですが、 EF はこのクラスに関する情報を取得しません。しかし、それは私が望むものではありません。EF に伝える必要があります。EditableBaseModelは、私のビューに適合するだけで、データベースには使用されないため、気にする必要はありません。
どうやってやるの?私が見つけた唯一の方法は、次のようにEditableBaseModelインスタンスを手動でBaseModelオブジェクトに変換することです。
public ActionResult Save(EditableBaseModel editableBaseModel) {
var baseModel = new BaseModel() {
Content = editableBaseModel.Content
// ...
};
myDbContextInstance.BaseModels.Add(baseModel);
}
しかし、複数の属性があるため、これは良い方法ではないようです。また、BaseModel に何かを追加するときに、ここにも追加する必要があるため、あまり柔軟ではありません。奇妙なエラーが発生する可能性があります。