2011-08-03 19 views
1

「トレーニング」に「User」テーブルの参照整合性を持つ「CreatedBy」という列があります。したがって、「CreatedBy」は実際にはトレーニングレコードを挿入したユーザーを表す「ユーザー」です。エンティティフレームワーク追加エンティティで子エンティティも追加されます

新しい「トレーニング」エンティティを追加すると、「CreatedBy」は古い「ユーザー」です。だから、ユーザーを追加しようとするべきではありません。しかし、ユニークなキー制約に違反しているので、失敗します。

ここにコードがあります。どこが間違っていますか?

public int AddEntity(Training entity, bool isSaveInstantly) 
    { 
     this.trainersDeskDBModel.Trainings.AddObject(entity); 

     if (isSaveInstantly) 
     { 
      this.trainersDeskDBModel.SaveChanges(); 
     } 
     return entity.Id; 
    } 

    public int UpdateEntity(Training entity, bool isSaveInstantly) 
    { 
     this.trainersDeskDBModel.Trainings.ApplyCurrentValues(entity); 
     if (isSaveInstantly) 
     { 
      this.trainersDeskDBModel.SaveChanges(); 
     } 
     return entity.Id; 
    } 

    public int Save(Training entity, bool isSavedInstantly) 
    { 
     IEnumerable<Training> training = this.trainersDeskDBModel.Trainings.Where(x => x.Id == entity.Id); 
     if (training != null && training.Count() > 0) 
     { 
      this.UpdateEntity(entity, isSavedInstantly); 
     } 
     else 
     { 
      this.AddEntity(entity, isSavedInstantly); 
     } 
     return entity.Id; 
    } 

答えて

2

あなたはEFあなたが新しいを追加する前に、コンテキストにそれを取り付けることによって、Userが既にDBに存在していることを伝える必要がありますあなたの中に新しいTrainingを追加している同じコンテキストでUserをロードしなかった場合Training

public int AddEntity(Training entity, bool isSaveInstantly) 
{ 
    this.trainersDeskDBModel.Users.Attach(entity.CreatedBy); 
    this.trainersDeskDBModel.Trainings.AddObject(entity); 

    if (isSaveInstantly) 
    { 
     this.trainersDeskDBModel.SaveChanges(); 
    } 
    return entity.Id; 
} 
関連する問題