У меня есть следующие классы (обрезанные, чтобы показать только базовую структуру):
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()
}
}
Класс
My Lead является производным от BaseModel , который содержит метод для сохранения изменений объекта в базе данных с помощью транзакции. Я реализовал транзакционный персистент с помощью метода расширения. Проблема в том, что, передав this в SafelyPersistChanges в моем BaseModel классе, универсальный 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' без постоянного атрибута.
Есть идеи?