C# 如果我只有entitysetname和唯一属性的值,有没有办法从上下文中获取对象?

C# 如果我只有entitysetname和唯一属性的值,有没有办法从上下文中获取对象?,c#,entity-framework-5,C#,Entity Framework 5,我正在尝试编写一个同步程序。我有一个本地数据库更改的日志表,并希望将其应用于远程数据库 对于每个日志条目,我需要在远程数据库中找到相应的记录,因为我知道entityset名称和名为RowId的唯一字段的值。RowId不是主键 我已经尝试将以下内容放入我的上下文类中,但这意味着每次添加新的域类时都必须编辑代码 有没有一种不使用巨型switch语句的方法来编写这个过程? 我有一个类似于实体框架的GetObjectByKey方法的方法 这是我想替换的巨型交换机声明 public object GetO

我正在尝试编写一个同步程序。我有一个本地数据库更改的日志表,并希望将其应用于远程数据库

对于每个日志条目,我需要在远程数据库中找到相应的记录,因为我知道entityset名称和名为RowId的唯一字段的值。RowId不是主键

我已经尝试将以下内容放入我的上下文类中,但这意味着每次添加新的域类时都必须编辑代码

有没有一种不使用巨型switch语句的方法来编写这个过程? 我有一个类似于实体框架的GetObjectByKey方法的方法

这是我想替换的巨型交换机声明

public object GetObjectByRowId(string EntitySetName, Guid RowId)
{
    switch ("People")
    {
        case AppDataEnum.People:
            return People.SingleOrDefault(x => x.RowId == RowId);
            break;
等等

我可能可以通过让所有实体实现一个IRowId接口来解决这个问题,但我希望EF有一种内置的方式

我问了一个相关的问题

我想答案可能会有帮助。尽管在这种情况下,许多类型都是从同一个表中提取的。在我的场景中,许多表都有RowId字段

Public Class Person : LoggedEntity
{
 public string FirstName { get; set; }
 public string LastName { get; set; }
}
公共类组织:LoggedEntity { 公共字符串名{get;set;} 公共字符串LastName{get;set;} }


在这种情况下,您的唯一键由类型+唯一标识符的元组组成。如果我正确理解了您的问题,那么行ID对于每个给定类型都是唯一的,但是两个不同类型的对象可能具有相同的行ID

您可以重写GetHashCode并基于类型和行ID的组合构造唯一的哈希。如何生成一个好的哈希函数超出了这个问题的范围,但作为一个非常愚蠢的解决方案,您可以执行以下操作(type.Name+RowId)。GetHashCode()

这将返回从两个字符串连接而来的字符串的哈希代码。从那时起,您可以将所有内容都放在哈希集中,并高效地检索对象


如果不关心效率,只需在各自的列表中跟踪每种类型的对象,在查找特定类型时,只需在感兴趣类型的对象列表上迭代以查找特定的RowId。

在这种情况下,您的唯一键由类型+唯一标识符的元组组成。如果我正确理解了您的问题,那么行ID对于每个给定类型都是唯一的,但是两个不同类型的对象可能具有相同的行ID

您可以重写GetHashCode并基于类型和行ID的组合构造唯一的哈希。如何生成一个好的哈希函数超出了这个问题的范围,但作为一个非常愚蠢的解决方案,您可以执行以下操作(type.Name+RowId)。GetHashCode()

这将返回从两个字符串连接而来的字符串的哈希代码。从那时起,您可以将所有内容都放在哈希集中,并高效地检索对象


如果效率不是一个问题,只需在它们自己的列表中跟踪每种类型的对象,在查找特定类型时,只需在感兴趣类型的对象列表上迭代以查找特定的RowId。

在了解涉及泛型的答案后,我最终得到了

    public TEntity GetEntityByRowId<TEntity>( Guid rowId) where TEntity : LoggedEntity
    {
        return Db.Set<TEntity>().SingleOrDefault(x => x.RowId == rowId);
    }
public TEntity GetEntityByRowId(Guid rowId),其中TEntity:LoggedEntity
{
返回Db.Set().SingleOrDefault(x=>x.RowId==RowId);
}

在意识到答案涉及泛型之后,我终于得到了答案

    public TEntity GetEntityByRowId<TEntity>( Guid rowId) where TEntity : LoggedEntity
    {
        return Db.Set<TEntity>().SingleOrDefault(x => x.RowId == rowId);
    }
public TEntity GetEntityByRowId(Guid rowId),其中TEntity:LoggedEntity
{
返回Db.Set().SingleOrDefault(x=>x.RowId==RowId);
}

但Guid不是主键您知道属性的名称吗?所有的实体都有这样的财产吗?是的,我知道财产的名称,它是RowId@kirsteng您的所有实体都有
RowId
属性?是的,它们有一个名为Id的标识键和一个名为RowId的Guid,但Guid不是主键。您知道属性的名称吗?所有的实体都有这样的财产吗?是的,我知道财产的名称,它是RowId@kirsteng您的所有实体都有
RowId
属性?是的,它们有一个名为Id的标识键和一个名为RowId的Guid RowId是一个Guid,因此,两个不同类型的对象不应具有相同的RowId如果我具有entityset名称,如何获取列表?RowId是guid,因此两个不同类型的对象不应具有相同的RowId如果我具有entityset名称,如何获取列表?