我想为我的一些实体添加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);
}