2016-03-26 19 views
0

Benim varlığımdan bazılarına uygulamamda, varlık üzerinde değişiklik bilgilerini (kullanıcı adı ve değişiklik zamanı) tutmak istiyorum. Bunu başarmak için bir arayüz oluşturdum; Entity Framework Saklama Modifikasyonu Bilgi Tasarım Önerisi?

/// <summary> 
/// Marks a trackable entity 
/// </summary> 
public interface ITrackableEntity 
{ 
    /// <summary> 
    /// Gets or sets the date the entity was modified 
    /// </summary> 
    DateTime? ModifiedOn { get; set; } 

    /// <summary> 
    /// Gets or sets the user who modified the entity 
    /// </summary> 
    string ModifiedBy { get; set; } 
} 
ve bu arabirimi uygulayan bir temel sınıf oluşturdu;
[Serializable] 
public abstract class BaseTrackableEntity : BaseEntity, ITrackableEntity 
{ 
    /// <summary> 
    /// Gets or sets the date the entity was modified 
    /// </summary> 
    public DateTime? ModifiedOn { get; set; } 
    /// <summary> 
    /// Gets or sets the user who modified the entity 
    /// </summary> 
    public string ModifiedBy { get; set; } 
} 

Ben DBContext devralınan benim kendi özel DBContext sınıf oluşturulur ve aşağıdaki şekilde SaveChanges işlevi overrode;
... 
foreach (DbEntityEntry entry in this.ChangeTracker.Entries()) 
{ 
    ... 
    ... 
    else if(entry.State == EntityState.Modified && entry.Entity is ITrackableEntity) 
    { 
     (entry.Entity as ITrackableEntity).ModifiedOn = DateTime.UtcNow; 
     (entry.Entity as ITrackableEntity).ModifiedBy = this._webHelper.GetLoggedInUserName(); 
    } 
} 
    ... 
return base.SaveChanges(); 

Bu

aslında çalışıyor ama varlık çerçevesi için yeni beri bu bunu yapmak için en iyi yoldur emin değilim. Bu noktada sorum şu; Bu tasarım gelecekte sorunlara neden olacak mı? Daha iyi bir çözüm var mı?

+0

Bu soru codereview.stackexchange.com adresinde daha iyi olur. –

cevap

0

Tasarımınız oldukça iyi, ancak olası bir sorun, web katmanınızı _webHelper.GetLogginInUserName() kullanarak veritabanı katmanınıza bağlamanızdır. Genel bir kural olarak, katmanların her birini ayrı tutmak istersiniz. Web'den başka bir şey kullanarak veri kaydetmek istediğinizde ne olur? Örneğin bir pencere servisi veya bir webAPI.

Çözümümüz bir soyut temel sınıf yaratmaktı:

/// <summary> 
/// this holds all the standard auditing information. Any EF table 
/// with a UI should extend this class 
/// </summary> 
public abstract class AuditableTable 
{ 
    [Required] 
    [MaxLength(789)] 
    public string CreatedBy { get; set; } 

    public DateTimeOffset CreationDate { get; set; } 

    [MaxLength(789)] 
    public string ModifiedBy { get; set; } 

    public DateTimeOffset? ModifiedDate { get; set; } 
} 
bu olumsuz elle denetim bilgisi doldurmak gerekir, ama ters doğrudan web sitesine bağlı değiliz olmasıdır

DataContext'te yerleşik kaydetme yöntemlerinden herhangi birini geçersiz kılmamız gerekmedi.

+0

Başlıklar için teşekkürler ve örnek için. Ayrıca DateTimeOffset yapısı hakkında da bilmiyordum. –

+0

Tarihleri ​​depolamak için iki seçeneğiniz vardır: her şeyi UTC'ye dönüştürün veya saat dilimini tarihle birlikte saklayın. Sonunu seçiyoruz. – jhilden