1

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

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

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

有没有办法在不使用巨大的 switch 语句的情况下编写程序?我的方法类似于 Entity Framework 的 GetObjectByKey 方法

这是我要替换的巨型 switch 语句

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

ETC..

我也许可以通过让所有实体实现一个 IRowId 接口来解决它,但我希望 EF 有一个内置的方式

我在这里问了一个相关的问题

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

Public Class Person : LoggedEntity
{
 public string FirstName { get; set; }
 public string LastName { get; set; }
}

公共类组织:LoggedEntity { public string FirstName { get; 放; } 公共字符串姓氏 { 获取;放; } }

Public Class LoggedEntity
{  [Key]
    public int Id { get; set; }
    public Guid RowId { get; set; }
}
4

2 回答 2

1

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

您可以覆盖 GetHashCode 并根据类型和行 ID 的组合构造一个唯一的哈希。如何提出一个好的散列函数超出了这个问题的范围,但作为一个非常愚蠢的解决方案,你可以做类似 (Type.Name + RowId).GetHashCode()

这将返回从两者连接的字符串的哈希码。从那时起,您可以将所有内容放入 HashSet 并有效地检索对象。

如果效率不是问题,只需在它们自己的列表中跟踪每种类型的对象,并在查找特定类型时,只需遍历具有感兴趣类型的对象列表以查找特定的 RowId。

于 2012-12-25T22:44:51.930 回答
0

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

    public TEntity GetEntityByRowId<TEntity>( Guid rowId) where TEntity : LoggedEntity
    {
        return Db.Set<TEntity>().SingleOrDefault(x => x.RowId == rowId);
    }
于 2013-02-22T02:53:53.363 回答