Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于泛型TKey类型生成新Id_C#_Asp.net_.net_Inheritance - Fatal编程技术网

C# 基于泛型TKey类型生成新Id

C# 基于泛型TKey类型生成新Id,c#,asp.net,.net,inheritance,C#,Asp.net,.net,Inheritance,下面是我正在构建的引导类库: class BaseEntity<TKey> { TKey Id { get; set; } } interface ICrudRepository<TItem, TKey> where TItem : BaseEntity<TKey> { void Create(TItem item); } class MyCrudRepository<TItem, TKey> : ICrudRepository

下面是我正在构建的引导类库:

class BaseEntity<TKey>
{
    TKey Id { get; set; }
}

interface ICrudRepository<TItem, TKey> where TItem : BaseEntity<TKey>
{
    void Create(TItem item);
}

class MyCrudRepository<TItem, TKey> : ICrudRepository<TItem, TKey> where TItem : BaseEntity<TKey>
{
    IEnumerable<TItem> _items;

    void Create(TItem item) 
    {
        item.Id = GetNewId();
    }

    TKey GetNewId() 
    {
        // what should I do here?

        // with int, this would be 
        // return _items.Select(x => x.Id).DefaultIfEmpty().Max() + 1;
    }
}
我当前的BaseEntity没有ae TKey参数,相反,它只使用和INT来存储项的键,但是如何扩展它以支持作为TKey的泛型类型呢?说Guid? 例如,如何处理新项目的生成? 对于顺序类型,它应该只使用现有的集合并返回最大的数字,但是在Guid上,也就是说,它应该只生成另一个集合


下面是完整的代码:

至于注释,唯一的解决方案是让使用者根据自己的逻辑和BaseEntity类型生成ID,因此让GetNewId抽象就足够了。 这是相关代码

public class MyCrudRepository<TItem, TKey....etc
{
    [...]

    public abstract TKey GetNewId();
}

您唯一的选择是将其保留为抽象,并在子类中提供一个实现,留给用户作为练习。另一方面,提供您自己的键,而不是让DB使用自动递增的值来创建它们,这只能在GUI中真正起作用,因为实际上不存在与其他客户端生成的GUI发生冲突的机会。使用key=oldKey+1机制,当您有多个DB客户机时,方案将转到s**t。在可能的情况下,将其留给数据库。@spender我创建此项是为了快速序列化和反序列化json项,因此无法使用repo链接。这使得无法在外部生成IDfunction@spender如果客户机不知道集合大小,那么在和INT的情况下如何生成Id?这些物品是否应该被视为公共财产?客户不可能轻易发现。正如@spender所说,如果您想在客户机上生成密钥,请使用GUID。否则,你就是在要求痛苦。如果绝对必须使用int,那么应该使用请求唯一的id,并用服务器生成的真正唯一的id替换它。将该id作为对创建请求的响应的一部分返回,然后客户端将其映射回来;这种方法存在漏洞,因为可能会出现问题,所以要么接受潜在的数据丢失/孤儿院。另一个选项是让客户端保留ID,然后发出请求。或者,使用GUID@spender请将您的评论作为答案发布,以便我将其标记为已接受。现在我已经考虑过了,让使用者生成id是有意义的,因为这样可以应用自定义使用者逻辑