【问题标题】:Entity Framework many to many relationship add/update实体框架多对多关系添加/更新
【发布时间】:2017-02-14 07:40:13
【问题描述】:

我有两个实体,当我只更新或添加一个时,一切正常

        db.Entry(user1).State = EntityState.Modified;
        foreach (var userAudio in user1.Audios)
        {
            db.Audios.AddOrUpdate(userAudio);
        }
        db.Users.AddOrUpdate(user1);
        db.SaveChanges();

但如果我尝试添加/更新几个实体:

        db.Entry(user1).State = EntityState.Modified;
        foreach (var userAudio in user1.Audios)
        {
            db.Audios.AddOrUpdate(userAudio);
        }
        db.Users.AddOrUpdate(user1);
        db.Entry(user2).State = EntityState.Modified;
        foreach (var userAudio in user2.Audios)
        {
            db.Audios.AddOrUpdate(userAudio);
        }
        db.Users.AddOrUpdate(user2);
        db.SaveChanges();

抛出异常:

附加类型为“EfTest.Entities.Audio”的实体失败,因为 另一个相同类型的实体已经具有相同的主键 价值...

也许是因为我在 user1 和 user2 中有相同的音频,而 EF 无法插入它们...有人知道如何解决这个问题吗?谢谢!

实体

namespace EfTest.Entities
{
    public class User
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public List<Audio> Audios { get; set; }
    }
    public class Audio
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }
        public string Artist { get; set; }
        public string Title { get; set; }
        public List<User> Users { get; set; }
    }
}

【问题讨论】:

  • @Antonio 它不起作用 =(
  • 如果你改变 public List
  • @Antonio 无论如何我认为同样的音频有这个问题,因为如果我删除它们,一切正常
  • 在每个 db.Users.AddOrUpdate();使用 db.SaveChanges();
  • @AnilPanwar 不起作用(

标签: c# asp.net asp.net-mvc entity-framework ado.net


【解决方案1】:

不幸的是,我只看到了一种解决方法。它是独立添加实体,然后添加关系:

var userAudios = new List<Audio>();
// Key userId
// Value list of audiosIds
var userAudiosRelations = new List<Relation>();
foreach (var user in users)
{

    foreach (var audio in user.Audios)
    {
        if (!userAudios.Any(x => x.Id == audio.Id))
        {
            userAudios.Add(audio);
        }
        userAudiosRelations.Add(new Relation
        {
            User_Id = user.Id,
            Audio_Id = audio.Id
        });
    }
    user.Audios = null;
    db.Users.AddOrUpdate(user);
}
foreach (var audio in userAudios)
{
    db.Audios.AddOrUpdate(audio);
}
db.SaveChanges();

var existingRelations = db.Database.SqlQuery<Relation>("SELECT * FROM dbo.UserAudios").ToList();
var relationsToAdd =
    userAudiosRelations.Where(
        x => existingRelations.All(y => x.User_Id != y.User_Id || x.Audio_Id != y.Audio_Id)).ToList();

foreach (var relation in relationsToAdd)
{
    db.Database.ExecuteSqlCommand("INSERT INTO dbo.UserAudios (User_Id, Audio_Id) VALUES (@p0, @p1)",
        relation.User_Id, relation.Audio_Id);
}

Where关系模型:

public class Relation
{
    public int User_Id { get; set; }
    public int Audio_Id { get; set; }
}

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多