Guid标识符 - 使PK或添加为附加属性?

时间:2016-03-09 20:00:10

标签: c# entity-framework primary-key guid

我想为我的一些实体添加Guid标识符。

我最初的做法是让这些实体成为Primary Key。但这似乎使我的其余代码更复杂。

例如,我们现在必须在通用存储库中允许多个ID类型,并为每个DbEntity指定PK类型(下面的代码示例)。

因此,我正在考虑在所有实体上保持一致int PK,并在需要时将Guid添加为 附加 属性。这也意味着我不必担心ensuring the Guid is not used as a clustering key

更简单的代码。没有群集担心。附加财产'方法看起来像我的胜利者。

但是,我不会在任何地方看到它被提及,使用或推荐。 (相比之下,有很多文章使用Guid进行PK的讨论)。

这种方法有什么缺点吗?能用这种方式回来咬我吗?

仅使用Int作为PK

public class DbEntity
{
    [Key]
    public int ID { get; set; }
} 

public class Car : DbEntity
{}

public class House: DbEntity
{}



public virtual T SelectByID(int id, params Expression<Func<T, object>>[] includeExpressions)
{
      var set = includeExpressions.Aggregate<Expression<Func<T, object>>, IQueryable<T>>
                  (table, (current, expression) => current.Include(expression));

      return set.SingleOrDefault(i => i.ID == id);
}

public virtual T SelectByGuid(string guid, params Expression<Func<T, object>>[] includeExpressions)
{
      var set = includeExpressions.Aggregate<Expression<Func<T, object>>, IQueryable<T>>
                  (table, (current, expression) => current.Include(expression));

      return set.SingleOrDefault(i => i.AdditionalGuidProperty == guid);
} 

使用Int和Guid作为PK

public class DbEntity<PKT>
{
    [Key]
    public PKT ID { get; set; }
} 

public class Car : DbEntity<int>
{}

public class House : DbEntity<guid>
{}



public virtual T SelectByID(PKT id, params Expression<Func<T, object>>[] includeExpressions)
{
      var set = includeExpressions.Aggregate<Expression<Func<T, object>>, IQueryable<T>>
                  (table, (current, expression) => current.Include(expression));

      ParameterExpression parameter = Expression.Parameter(typeof(T), "s");
      PropertyInfo propertyInfo = typeof(T).GetProperty("ID");
      MemberExpression memberExpression = Expression.MakeMemberAccess(parameter, propertyInfo);
      ConstantExpression constantExpression = Expression.Constant(id, typeof(PKT));
      BinaryExpression binaryExpression = Expression.Equal(memberExpression, constantExpression);
      Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(binaryExpression, parameter);

      return set.SingleOrDefault(lambda);
}

0 个答案:

没有答案