2016-06-24 8 views
0

同じタイプの別のエンティティがすでに同じプライマリキー値を持っているため、 'Scheduler.Models.UserImage'タイプのエンティティをアタッチできませんでした。これは、「Attach」メソッドを使用するか、またはグラフ内のエンティティのいずれかが競合するキー値を持つ場合、エンティティの状態を「Unchanged」または「Modified」に設定すると発生します。これは、一部のエンティティが新しく、データベース生成キー値をまだ受け取っていないことが原因です。 1の関係1でエンティティを更新リレーション1:1のエンティティを変更すると、挿入モードのときに例外が発生する

エラー:

私は関係0..1を持つ2つのテーブルのユーザーとUserImageを持っています。 私のアプリケーション内のユーザーの写真を別のテーブルに保存したい。

ユーザークラス:

public partial class User 
{ 
    public User() 
    { 
     this.FirstName = ""; 
     this.LastName = ""; 
     this.SurName = ""; 
     this.Mail = ""; 
     this.City = ""; 
     this.IsManager = false; 
     this.IsActive = false; 
     this.UserLevel = 0; 
     this.PhoneNumber = ""; 
     this.SiteMembers = new ObservableCollection<SiteMember>(); 
     this.GroupMembers = new ObservableCollection<GroupMember>(); 
    } 

    public int User_ref { get; set; } // PK Autoinc 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string SurName { get; set; } 
    public string Mail { get; set; } 
    public string City { get; set; } 
    public bool IsManager { get; set; } 
    public bool IsActive { get; set; } 
    public int UserLevel { get; set; } 
    public string PhoneNumber { get; set; } 
    public string Password { get; set; } 

    public virtual ObservableCollection<SiteMember> SiteMembers { get; set; } 
    public virtual ObservableCollection<GroupMember> GroupMembers { get; set; } 
    public virtual UserImage UserImage { get; set; } 
} 

UserImageクラス:

public partial class UserImage 
{ 
    public int Image_Ref { get; set; }// Auto Inc 
    public int User_Ref { get; set; } //Primary KEy 
    public byte[] Image { get; set; } 

    public virtual User User { get; set; } 
} 

は私が記録DbSetsにエンティティを追加しました。

var entity = new User(); 
DbSet<User> dbSet = db.Set<User>(); 
dbSet.Add(entity); 
db.Entry(entity).State = EntityState.Added; 

var entity = new UserImage(); 
DbSet<UserImage> dbSet = db.Set<UserImage>(); 
dbSet.Add(entity); 
db.Entry(entity).State = EntityState.Added; 

主キーを生成するために、フォーム内のいくつかのコントロールを変更し、変更を保存します。使用しているとき

var query = db.UserImages.Include(e => e.User); 
UserImage usrImg = query.AsNoTracking() 
        .Where(e => e.User_Ref == CurrentEntity.User_ref).FirstOrDefault(); 
db.Entry(usrImg).Entity.Image = UserImageSelection.Image; 
db.Entry(usrImg).State = EntityState.Modified;//Over here crashes 

「型 『Scheduler.Models.UserImage』の実体を取り付け、同じタイプの別のエンティティが既に同じ主キー値を持っているので、これが発生する可能性が失敗しました。 は、SaveChangesメソッドの後、私はthiseコードを持っていますグラフ内のエンティティのキ​​ー値が競合している場合、エンティティの状態を 'Unchanged'または 'Modified'に設定することができます。これは、新しいエンティティで、データベース生成キー値をまだ受け取っていないエンティティがあるためです。 "

CurrentEntity.User_Refは実際にはUser Tableです。私はここで間違っているのですが、なぜInsertモードでUserImageテーブルを変更できないのですか?

+0

なぜDbContextではなくエンティティのインスタンスを操作するためにDbSetsを使用していますか?どちらの方法でも同じ例外が発生します。 – Luis

+0

これは、同時に2つのテーブルに挿入する場合にのみ発生します。 – MartinZPetrov

+0

私はAsNoTrackingが問題の原因だと確信しています(少なくとも私はそこに他のものは見えません)。エントリを追跡しないように指示するので、基本的にコンテキストロジックから切り離されます。コンテキストはまだ初期状態のエントリを持っていますが、現在は非管理状態から再び追加して、その状態をmodifiedに設定しています。値を変更する予定がある場合は、.AsNoTracking()を使用しないでください。 – DevilSuichiro

答えて

0

1-1の関係については、両方のエンティティのPKをそれぞれの関連するエンティティに持つ必要があると確信しています。例えば、人と社会保障番号:あなたがテーブルに挿入したときに

public class Person 
{ 
    public int ID {get;set;} 
    public int SocialSecID {get;set;} 
} 

public class SocialSecurity 
{ 
    public int ID {get;set;} 
    public int PersonID {get;set;} 
} 

は今、実体のPKとFKの両方がユニークである必要があります。しかし、この方法を使用すると、SocialSecIDプロパティを使用している人のSocialSecurityを照会できます。

関連する問題