2013-05-25 132 views
0

我使用的GUID爲我的數據庫中的實體主鍵,使用模型綁定的asp.net 4.5 Web表單功能,當IM使用實體框架5將在數據庫中的記錄自動IM做類似生成的GUID主鍵EF5

public void onInsert([Control("ControlID")] int? countryID){ 

if(countryID.hasValue){ 
    var DbEntityToInsert = new DbEntity(); //where DbEntity is the class generated by the EF 
    TryUpdateModel(DbEntityToInsert); 
    DbEntityToInsert.GuidPK = Guid.NewGuid(); 
    if(Page.ModelState.IsValid){ 
    using(var db = new DatabaseContext()){ 
     db.Add(DbEntityToInsert); 
     db.Save(); 
    }//using ends 
    }//modelstate.isvalid if ends 
    }//countryid.hasvalue ends 
}//main method ends 

現在我想問問有沒有一種方法,我可以告訴EF生成GUID的PK同時插入一個新的記錄,因此我沒有寫線

DbEntityToInsert.GuidPK = Guid.NewGuid(); 

回答

1

您可以嘗試在派生的上下文中覆蓋SaveChanges。主要任務是確定實體是否具有GuidPK屬性作爲主鍵。下面是一個嘗試使用反射:

public override int SaveChanges() 
{ 
    this.ChangeTracker.DetectChanges(); 

    var addedEntities = this.ChangeTracker.Entries() 
     .Where(e => e.State == EntityState.Added) 
     .Select(e => new 
     { 
      Entity = e.Entity, 
      PropertyInfo = e.Entity.GetType().GetProperty("GuidPK") 
     }) 
     .Where(x => x.PropertyInfo != null && x.PropertyInfo.CanWrite); 

    foreach (var x in addedEntities) 
     x.PropertyInfo.SetValue(x.Entity, Guid.NewGuid()); 

    return base.SaveChanges(); 
} 

爲了避免此反射,你可以有一個由所有的實體使用GuidPK屬性作爲PK實現一個共同的接口:

public interface IEntityWithGuidPK 
{ 
    Guid GuidPK { get; set; } 
} 

public class DbEntity : IEntityWithGuidPK 
{ 
    public Guid GuidPK { get; set; } 
    // ... 
} 

然後在代碼SaveChanges可能是:

//... 

    var addedEntities = this.ChangeTracker.Entries() 
     .Where(e => e.State == EntityState.Added && 
      e.Entity is IEntityWithGuidPK) 
     .Select(e => e.Entity as IEntityWithGuidPK); 

    foreach (var e in addedEntities) 
     e.GuidPK = Guid.NewGuid(); 

    //...