gpt4 book ai didi

c# - 通用存储库和自定义类型的实体 ID

转载 作者:太空宇宙 更新时间:2023-11-03 15:52:28 25 4
gpt4 key购买 nike

我有以下层次结构:

public interface IIdentifiable<TKey> where TKey : IEquatable<TKey>
{
TKey Id { get; set; }
}

public interface IEntity<TKey> : IIdentifiable<TKey> where TKey : IEquatable<TKey>
{
}


//base entity
public class Entity<TKey> : IEntity<TKey> where TKey : IEquatable<TKey>
{
public virtual TKey Id { get; set; }
}

public class Test1: Entity<long>
{
...
}

这是存储库:

public interface IRepository<T, TKey>
where T : IEntity<TKey>
where TKey : IEquatable<TKey>
{
...
}

这个通用存储库:

public class Repository<T, TKey> : IRepository<T, TKey>
where T : IEntity<TKey>
where TKey : IEquatable<TKey>
{
...
}

这是我的通用 api Controller :

public class BaseReadController<T, TKey> : ApiController where T : IEntity<TKey> where TKey : IEquatable<TKey>
{
private readonly IRepository<T, TKey> _repo;

public BaseReadController(IRepository<T, TKey> repo)
{
_repo = repo;
}

public SingleResult<T> Get([FromODataUri] TKey key)
{
var test = _repo.Query().Where(t => t.Id == key);
}
}

但是我得到 Cannot apply operator == to operands of type Tkey and TKey

我试过这样的:

var test = _repo.Query().Where(t => t.Id.Equals(key))

但是我得到一个 NHibernate 异常:

message: "Boolean Equals(Int64)"
stacktrace: " at NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitMethodCallExpression(MethodCallExpression expression)
type: "System.NotSupportedException"

最佳答案

NHibernate 的 LINQ 提供程序有一些……需要改进的地方。因此我不建议尝试寻找一些方法来替换 .Query().Where(t => t.Id == key);用别的东西...

相反,我们应该扩展我们的 IRepository本地调用 session.Get<T>(key)

public interface IRepository<T, TKey>
where T : IEntity<TKey>
where TKey : IEquatable<TKey>
{
...
Get<T>(TKey key)
}

实现方式如下:

public class Repository<T, TKey> : IRepository<T, TKey>
where T : IEntity<TKey>
where TKey : IEquatable<TKey>
{
...
public virtual Get<T>(TKey key)
{
var session = ... // get current session
var result = session.Get<T>(key);
return result;
}
}

最后在我们的 Controller 中:

public virtual T Get([FromODataUri] TKey key)
{
var entity = _repo.Get<T>(key);
return T;
}

关于c# - 通用存储库和自定义类型的实体 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com