Entity framework EF CTP5 POCO,基类和如何实现继承

Entity framework EF CTP5 POCO,基类和如何实现继承,entity-framework,poco,entity-framework-ctp5,Entity Framework,Poco,Entity Framework Ctp5,哎,, 假设我希望我所有的记录都有一个标准的印章 inserted_by, inserted_at, updated_by, updated_at, deleted_by, deleted_at, timestamp 1-如果我必须把它放在一个基本(可能是抽象)POCO类中,那么实现它的最佳继承策略是什么。(我使用GUID作为主键。) 我不想将基类用于其他任何东西。 在我的背景下; 我想使用与db表相对应的end POCO类。 DbSet,看起来我必须使用DbSet,然后使用类型查询:) 2-

哎,, 假设我希望我所有的记录都有一个标准的印章

inserted_by, inserted_at, updated_by, updated_at, deleted_by, deleted_at, timestamp
1-如果我必须把它放在一个基本(可能是抽象)POCO类中,那么实现它的最佳继承策略是什么。(我使用GUID作为主键。)

我不想将基类用于其他任何东西。 在我的背景下; 我想使用与db表相对应的end POCO类。 DbSet,看起来我必须使用DbSet,然后使用类型查询:)


2-如果继承是断章取义的,您会推荐什么,ComplexType,或者一个接口?

我在EF4中就是这么做的。有一个通用存储库基类:

public class GenericRepository<T> : IGenericRepository<T> where T : BaseEntity
公共类GenericRepository:IGenericRepository其中T:BaseEntity
所有实体存储库都继承自此类。泛型.Add()和.Update()方法会自动设置审核数据:

public void Add(T entity)
{
        entity.CreatedOn = DateTime.UtcNow;
        entity.CreatedBy = UserName;
        entity.LastModifiedOn = entity.CreatedOn;
        entity.LastModifiedBy = entity.CreatedBy;
        ObjectContext.AddObject(GetEntitySetName<T>(), entity);
}

public void Update(T entity)
{
        T originalEntity = ObjectSet.Single(t => t.Id == entity.Id);            
        entity.CreatedOn = originalEntity.CreatedOn;
        entity.CreatedBy = originalEntity.CreatedBy;
        entity.LastModifiedOn = DateTime.UtcNow;
        entity.LastModifiedBy = UserName;
        ObjectSet.ApplyCurrentValues(entity);
}
公共作废添加(T实体)
{
entity.CreatedOn=DateTime.UtcNow;
entity.CreatedBy=用户名;
entity.LastModifiedOn=entity.CreatedOn;
entity.LastModifiedBy=entity.CreatedBy;
AddObject(GetEntitySetName(),实体);
}
公共无效更新(T实体)
{
T originalEntity=ObjectSet.Single(T=>T.Id==entity.Id);
entity.CreatedOn=originalEntity.CreatedOn;
entity.CreatedBy=originalEntity.CreatedBy;
entity.LastModifiedOn=DateTime.UtcNow;
entity.LastModifiedBy=用户名;
ObjectSet.ApplyCurrentValues(实体);
}

因此,您可以看到它没有进入POCO基类
BaseEntity
,因为它不是POCO的责任。相反,它属于存储库。

我在EF4中就是这样做的。有一个通用存储库基类:

public class GenericRepository<T> : IGenericRepository<T> where T : BaseEntity
公共类GenericRepository:IGenericRepository其中T:BaseEntity
所有实体存储库都继承自此类。泛型.Add()和.Update()方法会自动设置审核数据:

public void Add(T entity)
{
        entity.CreatedOn = DateTime.UtcNow;
        entity.CreatedBy = UserName;
        entity.LastModifiedOn = entity.CreatedOn;
        entity.LastModifiedBy = entity.CreatedBy;
        ObjectContext.AddObject(GetEntitySetName<T>(), entity);
}

public void Update(T entity)
{
        T originalEntity = ObjectSet.Single(t => t.Id == entity.Id);            
        entity.CreatedOn = originalEntity.CreatedOn;
        entity.CreatedBy = originalEntity.CreatedBy;
        entity.LastModifiedOn = DateTime.UtcNow;
        entity.LastModifiedBy = UserName;
        ObjectSet.ApplyCurrentValues(entity);
}
公共作废添加(T实体)
{
entity.CreatedOn=DateTime.UtcNow;
entity.CreatedBy=用户名;
entity.LastModifiedOn=entity.CreatedOn;
entity.LastModifiedBy=entity.CreatedBy;
AddObject(GetEntitySetName(),实体);
}
公共无效更新(T实体)
{
T originalEntity=ObjectSet.Single(T=>T.Id==entity.Id);
entity.CreatedOn=originalEntity.CreatedOn;
entity.CreatedBy=originalEntity.CreatedBy;
entity.LastModifiedOn=DateTime.UtcNow;
entity.LastModifiedBy=用户名;
ObjectSet.ApplyCurrentValues(实体);
}

因此,您可以看到它没有进入POCO基类
BaseEntity
,因为它不是POCO的责任。相反,它属于存储库。

您需要TPC继承(每个类的表或每个具体类型的表)。检查TPC的CTP5映射。

您需要TPC继承(每个类的表或每个具体类型的表)。检查TPC的CTP5映射。

你是如何做到的(我认为你没有使用POCO)+1我同意这一点。更新时间戳是一个数据库问题,将此逻辑放入POCO将使其不再是POCO。使用EF实现继承时,使用时间戳不是一个可行的理由。@RPM:我不同意-如果使用时间戳,通常需要将其映射到实体中,并将其设置为ConcurrencyCheckAttribute(代码优先)或固定并发模式(纯EF4)。如果不将时间戳映射到实体中,这与根本不使用它是一样的。@Ladislav-我有一个名为
DateModified
的字段,具有固定并发模式,映射到我的实体。在我看来这很好,因为它仍然是一个POCO,只是有另一个属性。区别在于这个时间戳的逻辑是EF,而不是POCO本身。@RPM:如果您认为时间戳本身破坏了POCO的含义,那么您是对的。但我会坚持使用时间戳。我相信“行版本”数据类型(如SQL时间戳)的存在有一个很好的理由。你是怎么做到的(我不认为你在使用POCO)+1我同意这一点。更新时间戳是一个数据库问题,将此逻辑放入POCO将使其不再是POCO。使用EF实现继承时,使用时间戳不是一个可行的理由。@RPM:我不同意-如果使用时间戳,通常需要将其映射到实体中,并将其设置为ConcurrencyCheckAttribute(代码优先)或固定并发模式(纯EF4)。如果不将时间戳映射到实体中,这与根本不使用它是一样的。@Ladislav-我有一个名为
DateModified
的字段,具有固定并发模式,映射到我的实体。在我看来这很好,因为它仍然是一个POCO,只是有另一个属性。区别在于这个时间戳的逻辑是EF,而不是POCO本身。@RPM:如果您认为时间戳本身破坏了POCO的含义,那么您是对的。但我会坚持使用时间戳。我相信“行版本”数据类型(如SQL时间戳)的存在有一个很好的理由。如果我使用TPC,我的数据库集由什么组成,我可以基于具体类型还是基于基本类型?@Hazimdekenli:当使用任何继承类型时,集合是数据库集,但集合中的实体是派生类型。您可以使用OfType只查询派生类型。这样它就不能提供我所需要的。@Hazimdekenli:为什么不能?您始终可以在DbContext上定义自定义属性,该属性将返回IQueryable并在内部使用DbSet.OfType。您可以尝试定义派生类型的DbSet-我没有尝试,我是用户,它与基类型一起工作。如果我使用TPC,我的DbSet由什么组成,我可以基于具体类型还是基类型?@hazimdekenli:当使用任何继承类型时,集合是DbSet,但集合中的实体是派生类型。您可以使用OfType只查询派生类型。这样它就不能提供我所需要的。@Hazimdekenli:为什么不能?你总是可以