1

我有这个帐户模型

 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);
        }
     }

现在,当我想通过 Id 获取实体时,例如:

 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);
        }

这有什么问题?任何帮助深表感谢。

4

2 回答 2

1

如错误消息所示,您只能使用 System.Int32 和 System.Guid 调用 DbSet.Find(params object[] keyValues) 方法。(以及 System.Decimal,System.DateTime 可能用于复合键)

该方法不会在您的模型中查找 Id 或 PK 并自动使用它(当您传递帐户时,该方法将不使用 Account.Id) - 因为它使用“主键值” http://msdn.microsoft。 com/en-us/library/gg696418(v=vs.103).aspx

考虑按照 EntityFramework 的 FindBy Id 方法中的建议传递谓词

如果您的模型始终具有类型 Guid 的 Id,那么也许您可以直接传递 Id:

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

希望这可以帮助。

于 2013-02-14T13:37:12.163 回答
1

您没有DBSet.Find()正确调用该方法。

正如文档所述,您需要通过

要查找的实体的主键值

您不传入实体的实例,而是传入标识实体的键值。从您的示例中,您不需要创建新的帐户实例:

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

你只需要传递accountIdFindBy()

_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;
}
于 2013-02-14T13:38:15.260 回答