2013-05-25 3 views
0

asp.net의 모델 바인딩 기능을 사용하여 데이터베이스의 엔터티에 대한 기본 키로 Guids를 사용하고 있습니다. 4.5 엔터티 프레임 워크 5를 사용하여 데이터베이스에 레코드를 삽입 할 때 웹 양식이 사용됩니다.EF5에서 자동으로 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 

같은 메신저하고 뭔가 지금은 내가 선

DbEntityToInsert.GuidPK = Guid.NewGuid(); 

답변

1
을 쓸 필요 없다, 그래서 새 레코드를 삽입하는 동안 내가 PK에 대한 GUID를 생성하기 위해 EF을 알 수있는 방법이 물어보고 싶은게

파생 된 컨텍스트에서 SaveChanges을 재정의 할 수 있습니다. 주요 작업은 엔티티에 기본 키로 GuidPK 속성이 있는지 확인하는 것입니다. 그런 다음

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

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

코드에서 :

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(); 
} 

여기 반사를 방지하기 위해 당신이 PK로 GuidPK 속성을 사용하는 모든 기관에 의해 구현되는 공통 인터페이스를 가질 수있다 : 여기에 시도하여 반영 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(); 

    //...