在mvc 5项目中使用identiy。 我有用户和优惠券模型,
public class ApplicationUser : IdentityUser
{
public string Name { get; set; }
public string Surname { get; set; }
public int TeamId { get; set; }
public int AvatarId { get; set; }
public DateTime RegisterationDate { get; set; }
public virtual Avatar Avatar { get; set; }
public ApplicationUser()
{
this.Coupons = new HashSet<Coupon>();
}
public virtual ICollection<Coupon> Coupons { get; set; }
}
优惠券
public class Coupon
{
public long Id { get; set; }
public string Barcode { get; set; }
public DateTime Date{ get; set; }
public float Bet { get; set; }
public Double Price { get; set; }
public bool System { get; set; }
public Double TotalGain { get; set; }
public int Status { get; set; }
public string UserId { get; set; }
public virtual ApplicationUser User { get; set; }
public virtual CouponDetail CouponDetail { get; set; }
}
用户和优惠券之间存在关联。
我想通过UserManager用优惠券列表更新用户。
private void InsertCoupon(Coupon coupon)
{
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
var userId = User.Identity.GetUserId();
if(userId != null){
var user = userManager.FindById(userId);
user.Coupons.Add(coupon);
userManager.UpdateAsync(user);
}
}
代码有效,但没有在优惠券表上插入。如何使用优惠券列表更新用户?
答案 0 :(得分:1)
此代码返回的用户对象:
var user = userManager.FindById(userId);
是分离的用户。它不包含在EF上下文中。为了能够更新对象并且您希望更改反映在数据库中,您应该让用户在同一会话中更新它。这会给我们这样的东西:
if(userId != null){
var user = context.Users.FirstOrDefault(u => u.UserId = userId)
user.Coupons.Add(coupon);
userManager.UpdateAsync(user);
context.SaveChanges();
}
不要忘记在更新后保存更改。通过将用户对象附加到您的上下文,这应该可行。
使用附加方法
您还可以将分离的对象附加到上下文对象。像这样:
context.Users.Attach(user);
但我更愿意获取对象并在第一个选项中提出的同一会话中更新所有内容。