를 호출 할 때마다 databaseContext.SaveChanges()
Entity Framework에서 데이터를 저장하기 전에 모든 개체와 해당 자식 클래스가 CreatedOn
필드를 DateTime.Now()
.
세부 정보 : BaseEntity
모든 엔터티가 상속 하는 클래스가 있습니다.
public class BaseEntity
{
[Key]
public virtual Guid Id{ get; set; }
public DateTime CreatedOn { get; set; }
}
BaseEntity
위에서 상속 된 항목이 저장 될 때마다 CreatedOn
속성이 할당됩니다 DateTime.Now
.
다음은이를 수행하는 기본 저장소입니다.
public abstract class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : BaseEntity
{
....
public virtual bool SaveChanges(TEntity entity)
{
if (entity.CreatedOn == DateTime.MinValue)
entity.CreatedOn = DateTime.Now;
else
entity.ModifiedOn = DateTime.Now;
return _databaseContext.SaveChanges() > 0;
}
}
이것은 잘 작동하지만 문제는 객체 자체의 CreatedOn
속성 만 업데이트 된다는 것 입니다. 모든 하위 클래스 는 업데이트 되지 않을 수 있습니다 .
SaveChanges()
모든 자식 클래스를 업데이트하고 CreatedOn
날짜도 설정하도록 메서드의 논리를 어떻게 변경할 수 있습니까?
이를 더 명확하게하기위한 예제를 제공하겠습니다. User
아래 에있는 객체 의 인스턴스가 dbContext
new와 함께에 추가 Profile
되고 새 Role
클래스 인스턴스가 할당 된 다음 SaveChanges()
호출 된다고 상상해보십시오 .
public class User: BaseEntity
{
[Key]
public virtual Guid Id { get; set; }
public UserRole Role { get; set; }
public ProfileDetails Profile { get; set; }
public DateTime CreatedOn { get; set; }
public Guid CreatedBy { get; set; }
}
CreatedOn
날짜가 child user.Role
및 user.Profile
객체에 할당 되도록하는 가장 좋은 방법은 무엇입니까 (두 클래스 모두에서 상 속됨 BaseEntity
)? 리플렉션을 사용하여 CreatedOn
필드의 자식 개체 속성을 확인하려고 생각 했지만 모든 루핑이 옳지 않은 것 같습니다. 더 좋은 방법이 있습니까?
기본적으로 SaveChanges
자신의 DB 컨텍스트 클래스에서 메서드를 재정의하고 EF 변경 추적기를 사용하여 새로 만든 모든 개체를 가져온 다음 CreatedOn
그에 따라 필드 를 설정해야 합니다.
이것의 라인을 따라 뭔가 :
public class DbContextBase : DbContext
{
public override int SaveChanges()
{
DateTime currentDateTime = DateTime.Now;
// get all the entities in the change tracker - this could be optimized
// to fetch only the entities with "State == added" if that's the only
// case you want to handle
IEnumerable<DbEntityEntry<BaseEntity>> entities = ChangeTracker.Entries<BaseEntity>();
// handle newly added entities
foreach (DbEntityEntry<BaseEntity> entity in entities.Where(e => (e.State == EntityState.Added))
{
// set the CreatedOn field to the current date&time
entity.Entity.CreatedOn = currentDateTime;
}
// to the actual saving of the data
return base.SaveChanges();
}
}
물론이를 개선 할 수 있습니다.
e.State == EntityState.Modified
설정하십시오.ModifiedOn
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다