Я хотел бы рекомендовать альтернативную версию, состоящую только из GetObjectById, как рекомендовано Биллом Дейли, проблема в том, что этот метод вызовет исключение, если не существует объекта с данным Id. Это все прекрасно, если вы ожидаете найти свой объект, но в противном случае вы, вероятно, хотели бы получить вместо него нулевую ссылку. Я использую следующий код, который предполагает, что модель имеет свойство с именем Id. Я использую дополнительный метод, чтобы проверить это в конструкторе хранилища.
public Repository(...)
{
// code...
GetByIdAccepted = ExamineIdKey();
}
protected bool ExamineIdKey()
{
// Fetch the type and look for an "Id"-member
return typeof(TModel).GetMember("Id", BindingFlags.Instance | BindingFlags.Public).Length > 0;
}
public TModel GetById(object id)
{
// Validate that GetById is ok for our given model
if(!GetByIdAccepted)
throw new InvalidOperationException("error text");
object model;
if (Connection.TryGetObjectByKey(new EntityKey(EntityName, "Id", id), out model))
return (TModel)model;
return null;
}