c# - EntityFrameworks inserts already inserted related item -
im trying create user, connect user model called event.
var user = new applicationuser { name = "test", email = "test@test.com" }; var userresult = usermanager.create(user, "password"); if (userresult.succeeded) { signinmanager.signinasync(user, ispersistent: false, rememberbrowser: true); @event.createdby = user; @event.createdbyid = new guid(user.id); db.events.add(@event); db.savechanges(); }
but db.savechanges()
throws validation error on applicationuser model: user email exists: test@test.com (even though didnt exists before request)
so seem ef trying reinserted inserted user.
the event model have these setters/getters
public virtual applicationuser createdby { get; set; } public virtual guid createdbyid { get; set; }
and works great if current singned in user instead of signing new one.
i have tried set @event.createdbyid
, skip @event.createdby
, ef doesnt save reference database.
this line creates new user (and saves database):
var userresult = usermanager.create(user, "password");
so don't have result got database (return value of add
method), proxy ef knows exists in database. in fact it's link between database record , object have in memory. have following lines:
@event.createdby = user; db.events.add(@event); db.savechanges();
you assign user
(which simple poco, no connection ef whatsoever) event. when add event database, ef try create new user again because it's not know yet, of course error. have user created database , assign event. if able change method usermanager.create
accepts dbcontext
, pass context, create user , when need user can use same context again , use find
method (which looks objects in context in memory, no db call) find user you've added.
edit: maybe simple solution in case attach user context:
var user = new applicationuser { name = "test", email = "test@test.com" }; var userresult = usermanager.create(user, "password"); if (userresult.succeeded) { signinmanager.signinasync(user, ispersistent: false, rememberbrowser: true); db.users.attach(user); @event.createdby = user; @event.createdbyid = new guid(user.id); db.events.add(@event); db.savechanges(); }
this tells ef know object exists in database.
Comments
Post a Comment