修改关系为1:1的实体在插入模式下会导致异常

本文关键字:模式 插入 异常 关系 实体 修改 | 更新日期: 2023-09-27 17:49:15

添加类型为'Scheduler.Models '的实体。UserImage失败,因为另一个相同类型的实体已经具有相同的主键值。当使用"Attach"方法或将实体的状态设置为"Unchanged"或"Modified"(如果图中的任何实体具有冲突的键值)时,可能会发生这种情况。这可能是因为一些实体是新的,还没有接收到数据库生成的键值。

更新关系为1到1的实体错误:

我有两个表User和UserImage的关系0..1。我想将应用程序中用户的图片存储在另一个表中。

用户类:

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; }
}

我在记录dbset中添加了实体。

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;

为了生成主键,我修改了表单中的一些控件并调用save更改。在保存更改之后,我有了这些代码:

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失败,因为另一个相同类型的实体已经具有相同的主键值。当使用"Attach"方法或将实体的状态设置为"Unchanged"或"Modified"(如果图中的任何实体具有冲突的键值)时,可能会发生这种情况。这可能是因为一些实体是新的,还没有接收到数据库生成的键值。"

CurrentEntity的地方。User_Ref实际上是用户表。我在这里做错了什么,为什么不能在插入模式下修改UserImage表。

修改关系为1:1的实体在插入模式下会导致异常

对于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属性查询该人的社保