2

我正在研究一种可重用的数据库存储库方法,用于使用 EntityFramework 4.3 将实体附加和保存到数据库。

    private void SaveObject<T>(T entityToSave, DbSet<T> dbSet) where T : class
    {
        if (db.Entry(entityToSave).State == EntityState.Detached)
        {
            if (entityToSave.Id == Guid.Empty) // how do I access the Id property?
                dbSet.Add(entityToSave);
            else
                db.Entry(entityToSave).State = EntityState.Modified;
        }
    } 

我遇到的问题是我需要告诉我的方法哪个属性是 Id,以便我可以检查它是否已设置。如果它是空的,那么我知道我正在创建一个全新的记录。否则,我正在修改现有记录。

如何告诉我的方法 Id 属性是什么?

4

3 回答 3

3

您需要创建一个包含该Id属性的接口。

让你所有的实体类都实现这个接口并约束T去实现它。( where T : IHasId)
然后您将能够在您的方法中访问此接口的所有成员。

于 2012-05-13T14:19:50.080 回答
3

您需要一个定义Id属性的接口或基类,并将其用作您的通用约束。例子:

public interface IEntity
{
    Guid Id { get; }
}

private void SaveObject<T>(T entityToSave, DbSet<T> dbSet) where T : class, IEntity
    {
        if (db.Entry(entityToSave).State == EntityState.Detached)
        {
            if (entityToSave.Id == Guid.Empty) // how do I access the Id property?
                dbSet.Add(entityToSave);
            else
                db.Entry(entityToSave).State = EntityState.Modified;
        }
    } 
于 2012-05-13T14:20:01.390 回答
1

正如其他人所展示的,您可以通过使用界面来解决问题。另一种可能性是定义访问器委托

private void SaveObject<T>(T entityToSave, DbSet<T> dbSet, Func<T,Guid> accessId)
{
    ...
    Guid id = accessId(entityToSave);
    ...
}

打电话给

SaveObject(entityToSave, dbSet, e => e.Id)
SaveObject(otherEntityToSave, dbSet, e => e.UserID)

与接口相比的优势在于,id 可以具有不同的名称,并且与第二个通用参数一起,甚至可以具有不同的类型

private void SaveObject<T,I>(T entityToSave, DbSet<T> dbSet, Func<T,I> accessId)
{
    ...
    I id = accessId(entityToSave);
    ...
}
于 2012-05-13T14:25:47.090 回答