我有我的内容模型:
class BaseModel {
public virtual string Content{ get; set; }
// ...
}
要显示数据,只有上面的模型就可以了。但我想添加编辑内容的功能。所以我需要为成员内容添加一个属性——但这应该只发生在作者按下编辑按钮时,而不是在内容的常规视图中。
所以我创建了第二个模型,它继承自BaseModel以便我可以用我的属性覆盖成员:
class EditableBaseModel : BaseModel {
[UIHint("MyEditor"), AllowHtml]
public override string Content{ get; set; }
}
这工作正常,但由于继承 EF 创建一个额外的列鉴别器。它包含类的类型作为字符串。在我的情况下,它总是BaseModel因为我总是在将EditableBaseModel转换为BaseModel之前它被保存到数据库中,如下所示:
myBbContextInstance.BaseModels.Add(editableBaseModelInstance as EditableBaseModel);
因此,鉴别器列是浪费空间,我想删除它。我发现这可以使用 NotMapped-attribute来完成。但是当我尝试保存模型时,这将导致以下异常:
找不到 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 添加一些东西时,我也必须在这里添加它——这可能会导致奇怪的错误。