gpt4 book ai didi

c# - 如何通过查找器界面在 Entity Framework 4 中查找实体? (适用于 Linq To Sql)

转载 作者:太空宇宙 更新时间:2023-11-03 16:50:31 24 4
gpt4 key购买 nike

我有一个存储库层,我的应用程序可以访问它,它可以用 IDataSource 初始化;例如LinqToSqlDataSource、EntityFrameworkDataSource 等...

IDataSource 分别提供了插入、更新、删除和查询数据源的方法。与这个问题相关的是 FindAll<T>返回 IQueryable<T> .

我所有的基础实体都实现了一个简单的接口(interface),使通过 id 查找实体变得通用和方便;

public interface IAmIdentifiable<T>
{
T Id { get; set; }
}

下面是FindById<T, TKey>的相关代码我在 EntityFramework 中遇到问题的方法。

public class Repository
{
public Repository(IDataSource dataSource)
{...}

public T FindById<T, TKey>(TKey identifier) where T : class, IAmIdentifiable<TKey>
{
return _DataSource.FindAll<T>().SingleOrDefault(i => i.Id.Equals(identifier));
}

...
}

FindById<T, Tkey>(...) 适用于 LinqToSql,但不适用于 EntityFramework 4

示例用法

User user = Repository.FindById<User, int>(someUserId);
Message msg = Repository.FindById<Message, Guid>(someMessageId);

当使用 EntityFramework 4 IDataSource 实现运行上述代码时,它会产生以下错误;

无法创建“System.Object”类型的常量值。在此上下文中仅支持基本类型(“例如 Int32、String 和 Guid”)。

我曾尝试更改它以对值类型执行 == 比较。我读到将泛型约束为值类型的迂回方法是约束为 struct .我已经相应地更新了所有实体和存储库查找器的基本接口(interface)...

public interface IAmIdentifiable<T> where T : struct
{
T Id { get; set; }
}

public T FindById<T, TKey>(TKey identifier)
where T : class, IAmIdentifiable<TKey>
where TKey : struct
{
return _DataSource.FindAll<T>().SingleOrDefault(i => i.Id == identifier);
}

但是这仍然会导致编译错误;

错误 59 运算符 '==' 不能应用于 'TKey' 和 'TKey' 类型的操作数

任何人都可以阐明我如何将这些实体转换到 IAmIdentifiable<T> 中吗?接口(interface)以便有一个通用的方法来通过 Id 检索实体?

最佳答案

我认为错误在于您尝试比较 TKey 泛型的方式。由于 TKey 是复杂类型,因此必须显式实现 == 运算符才能进行此比较。现在使用 TKey 泛型,不能保证它是。也许您可以在 TKey 上放置另一个通用约束以确保有可用的比较方法?

关于c# - 如何通过查找器界面在 Entity Framework 4 中查找实体? (适用于 Linq To Sql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093592/

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