C# 实体框架多对多关系添加/更新
我有两个实体,当我只更新或添加一个时,一切都正常C# 实体框架多对多关系添加/更新,c#,asp.net,asp.net-mvc,entity-framework,ado.net,C#,Asp.net,Asp.net Mvc,Entity Framework,Ado.net,我有两个实体,当我只更新或添加一个时,一切都正常 db.Entry(user1).State = EntityState.Modified; foreach (var userAudio in user1.Audios) { db.Audios.AddOrUpdate(userAudio); } db.Users.AddOrUpdate(user1); db.SaveChang
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; }
}
}
namespace EfTest.Entities
{
公共类用户
{
[关键]
[数据库生成(DatabaseGeneratedOption.None)]
公共int Id{get;set;}
公共字符串名称{get;set;}
公共整数{get;set;}
公共列表音频{get;set;}
}
公共类音频
{
[关键]
[数据库生成(DatabaseGeneratedOption.None)]
公共int Id{get;set;}
公共字符串艺术家{get;set;}
公共字符串标题{get;set;}
公共列表用户{get;set;}
}
}
不幸的是,我认为只有一种方法可以解决这个问题。它是独立添加实体,然后添加关系:
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);
}
@Antonio it not works=(如果您将public List Audios{get;set;}更改为public ICollection Audios{get;set;},并且在ICollectionUsers{get;set;}中更改为public ICollection Audios{get;set;}并更新db.Entry(user).CurrentValues.SetValues(usermodified)@Antonio不管怎样,我认为在相同的音频中存在这个问题,因为如果我删除它们,在每次db.Users.AddOrUpdate()之后,它们都能正常工作;使用db.SaveChanges();@AnilPanwar不起作用(
public class Relation
{
public int User_Id { get; set; }
public int Audio_Id { get; set; }
}