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

时间:2016-06-24 15:47:17

标签: c# entity-framework

附加“Scheduler.Models.UserImage”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。

错误更新关系为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; }
}

我在录制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;

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

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'方法或将实体的状态设置为如果图中的任何实体具有冲突的键值,则“未更改”或“已修改”。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。“

其中CurrentEntity.User_Ref实际上是用户表。我在这里做错了什么,为什么在插入模式下无法修改UserImage表。

1 个答案:

答案 0 :(得分: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。