2013-02-14 4 views
1

У меня есть этот счет Модель:FindBy метод Entity Framework

public class Account :IAggregateRoot 
    { 
     public Account() 
     { 
     } 
     public Account(Guid accountId) 
     { 
      Id = accountId; 
     } 

     public Guid Id { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Email { get; set; } 
     } 
} 

и это хранилище класса:

public class Repository<T> : IRepository<T> where T : class, IAggregateRoot 
    { 

     private readonly DbSet<T> _entitySet; 

     public T FindBy(T entity) 
     { 
      return _entitySet.Find(entity); 
     } 
    } 

и теперь, когда я хочу, чтобы получить объект по идентификатору, например, :

public AccountViewModel GetAccountBy(Guid accountId) 
     { 
      var account = new Account(accountId); 
      _unitOfWork.AccountRepository.FindBy(account); 
      var accountView = account.ConvertToAccountView(); 
      return accountView; 
     } 

Я получил это Ошибка:

The specified parameter type is not valid. Only scalar types, such as System.Int32, System.Decimal, System.DateTime, and System.Guid, are supported. 

мои действия назвать GetAccountBy как это:

public ActionResult Edit(Guid accountId) 
     { 
      var account = _accountService.GetAccountBy(accountId); 
      return View(account); 
     } 

, что проблема с этим? Буду признателен за любую оказанную помощь.

+0

возможный дубликат метода [FindBy Id в EntityFramework] (http://stackoverflow.com/questions/14865013/findby-id-method-in-entityframework) – Jehof

+0

изменить свое существование перед тем, как начать новый – Jehof

ответ

1

Вы не вызываете метод DBSet.Find() правильно.

As the documentation states вам необходимо пройти

Значения первичного ключа для сущности можно найти

не пройти в экземпляра сущности, вы передаете значения значения, которые идентифицируют объект. Из вашего примера вам не нужно создавать новый экземпляр счета:

var account = new Account(accountId); 
_unitOfWork.AccountRepository.FindBy(account); 

вам просто необходимо пройти accountId к FindBy()

_unitOfWork.AccountRepository.FindBy(accountId); 

Вот ваш код изменен на:

public class Repository<T> : IRepository<T> where T : class, IAggregateRoot 
{ 

    private readonly DbSet<T> _entitySet; 

    public T FindBy(params Object[] keyValues) 
    { 
     return _entitySet.Find(keyValues) 
    } 
} 

public AccountViewModel GetAccountBy(Guid accountId) 
{ 
    _unitOfWork.AccountRepository.FindBy(accountId); 
    var accountView = account.ConvertToAccountView(); 
    return accountView; 
} 
1

Вы можете вызвать DbSet.Find (params object [] keyValues) Метод только с System.Int32 и System.Guid, как указывает сообщение об ошибке. (хорошо и System.Decimal, System.DateTime, вероятно, для составных ключей)

Метод не будет искать идентификатор или ПК в вашей модели и использовать его автоматически (при передаче учетной записи метод не будет использовать Account.Id) - как его использование «первичный ключ» http://msdn.microsoft.com/en-us/library/gg696418(v=vs.103).aspx

Рассмотрит пропускание предиката, как предложено в FindBy Id method in EntityFramework

Если вы Модель всегда иметь идентификатор типа Guid, то, возможно, вы можете передать Id непосредственно:

public T FindBy(T entity) 
     { 
      return _entitySet.Find(entity.Id); 
     } 

Надеюсь, это поможет.

Смежные вопросы