【发布时间】:2010-10-08 10:33:40
【问题描述】:
我有以下类(修剪后只显示基本结构):
public abstract class BaseModel {
public bool PersistChanges() {
// Context is of type "ObjectContext"
DatabaseHelper.Context.SafelyPersistChanges(this);
}
}
public static class ObjectContextExtensions {
public static bool SafelyPersistChanges<T>(this ObjectContext oc, T obj) {
// Persist the object using a transaction
}
}
[Persistent("LEADS")]
public class Lead : BaseModel {
// Extra properties
}
public class LeadsController : Controller {
public ActionResult Save(Lead lead) {
lead.PersistChanges()
}
}
我的 Lead 类派生自 BaseModel,其中包含使用事务将对象的更改持久保存到数据库的方法。我使用扩展方法实现了事务持久化。问题是通过在我的 BaseModel 类中将 this 传递给 SafelyPersistChanges,扩展方法上的通用 T 设置为 BaseModel。但是,由于 BaseModel 没有被标记为持久对象(它不可能),ORM 框架会引发异常。
例子:
Lead lead = LeadRepository.FindByNumber(2);
lead.SalesmanNumber = 4;
// Calls "ObjectContextExtensions.SafelyPersistChanges<BaseModel>(BaseModel obj)"
// instead of "ObjectContextExtensions.SafelyPersistChanges<Lead>(Lead obj)"
lead.PersistChanges();
上述代码块引发以下异常:
无法为没有持久属性的“SalesWeb.Data.BaseModel”类型创建映射。
有什么想法吗?
【问题讨论】:
标签: c# generics inheritance