同じタイプの別のエンティティがすでに同じプライマリキー値を持っているため、 '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テーブルを変更できないのですか?
なぜDbContextではなくエンティティのインスタンスを操作するためにDbSetsを使用していますか?どちらの方法でも同じ例外が発生します。 – Luis
これは、同時に2つのテーブルに挿入する場合にのみ発生します。 – MartinZPetrov
私はAsNoTrackingが問題の原因だと確信しています(少なくとも私はそこに他のものは見えません)。エントリを追跡しないように指示するので、基本的にコンテキストロジックから切り離されます。コンテキストはまだ初期状態のエントリを持っていますが、現在は非管理状態から再び追加して、その状態をmodifiedに設定しています。値を変更する予定がある場合は、.AsNoTracking()を使用しないでください。 – DevilSuichiro