实体尝试更新不正确的 table / IEntityChangeTracker 问题的多个实例
Entity Attempting to update incorrect table / multiple instances of IEntityChangeTracker issue
这可能是个愚蠢的问题,但我还是要问。
一些事实。
- 根据我的参考,我使用实体 6.0.0.0。
- 我遇到了天蓝色的 sql 分贝。
- 该项目基于 mvc 默认模板 thingo。
所以我试图通过以下代码添加到 table。请注意,每次只尝试了 1 条路径,而不是同时尝试全部 3 条路径或组合。
public User(UserModel userModel)
{
using (var db = new SqlDogContext())
{
// Path 1 this seem like there is a better way but throws an exception anyways
var sillyModel = new UserModel() { Id = userModel.Id };
db.UserLibarys.Add(new UserLib {User = sillyModel, Libary = RssLibObject});
db.SaveChanges();
db.UserLibarys.Add(new UserLib {User = sillyModel, Libary = KodiLibObject});
db.SaveChanges();
db.UserLibarys.Add(new UserLib {User = sillyModel, Libary = SoundCloudLibObject });
db.SaveChanges();
db.UserLibarys.Add(new UserLib {User = sillyModel, Libary = SpotifyBridgeObject });
db.SaveChanges();
// Path 2 I guess this would be ok
var sillyModel = new UserModel() { Id = userModel.Id };
db.UserLibarys.Add(new UserLib { User = sillyModel, Libary = RssLibObject });
db.UserLibarys.Add(new UserLib { User = sillyModel, Libary = KodiLibObject });
db.UserLibarys.Add(new UserLib { User = sillyModel, Libary = SoundCloudLibObject });
db.UserLibarys.Add(new UserLib { User = sillyModel, Libary = SpotifyBridgeObject });
db.SaveChanges();
// Path 3 - What i want to use..
db.UserLibarys.Add(new UserLib { User = userModel, Libary = RssLibObject });
db.UserLibarys.Add(new UserLib { User = userModel, Libary = KodiLibObject });
db.UserLibarys.Add(new UserLib { User = userModel, Libary = SoundCloudLibObject });
db.UserLibarys.Add(new UserLib { User = userModel, Libary = SpotifyBridgeObject });
db.SaveChanges();
}
}
路径 1 出现以下异常。
{"Violation of PRIMARY KEY constraint 'PK_dbo.UserModels'.
Cannot insert duplicate key in object 'dbo.UserModels'.
The duplicate key value is (009d1c33-a3cf-49db-8243-ff8a447eff16).
\r\nThe statement has been terminated."}
路径 2 出现以下异常。
An exception of type 'System.Data.Entity.Validation.DbEntityValidationException' occurred in EntityFramework.dll but was not handled in user code
使用我在 Whosebug 某处找到的这个。
try
{
// Your code...
// Could also be before try if you know the exception occurs in SaveChanges
db.SaveChanges();
}
catch (DbEntityValidationException e)
{
foreach (var eve in e.EntityValidationErrors)
{
Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State);
foreach (var ve in eve.ValidationErrors)
{
Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage);
}
}
throw;
}
我收到以下消息
The User field is required.
这对我来说意义不大,因为在我看来,我正在提供它。
路径 3 出现以下异常。
Additional information: An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
这让我感到困惑,因为它看起来更新错误 table。
这是我的模特
public class UserLib
{
[Key]
public int LibId { get; set; }
public bool UserEnabled { get; set; }
[Required]
public virtual Lib Libary { get; set; }
[Required]
public virtual UserModel User { get; set; }
}
public class UserModel
{
[Key, ForeignKey("ApplicationUser")]
public string Id { get; set; }
public virtual UserLib Libary { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
}
public class Lib
{
public string Name { get; set; }
public string Logo { get; set; }
[Key]
public int LibId { get; set; }
public virtual UserLib UserLib { get; set; }
}
public class ApplicationUser : IdentityUser
{
public virtual UserModel MyUserModel { get; set; }
// plus some other stuff in here that seems non relavent
}
这是创建用户模型的地方
using (var db = new SqlDogContext())
{
db.UserModels.Add(
new UserModel()
{
Id = currentId
}
);
db.SaveChanges();
query = from b in db.UserModels
where b.Id == currentId
select b;
}
_CurrentUser = new User(query.First());
最终目标是一个用户对应一个用户模型
许多用户库的一个用户模型
并让 UserLibaries 拥有库数据库的外键。
所以我可能犯了一个新手错误,但是有人能看到我的问题吗:)。
您正在尝试设置主键:var sillyModel = new UserModel() { Id = userModel.Id };然后多次存储它,这是你做不到的。让 entity framework 设置主键。另请注意,您不必在每次操作后继续调用 SaveChanges()。您可以执行所有插入操作,然后调用一次。
这可能是个愚蠢的问题,但我还是要问。
一些事实。
- 根据我的参考,我使用实体 6.0.0.0。
- 我遇到了天蓝色的 sql 分贝。
- 该项目基于 mvc 默认模板 thingo。
所以我试图通过以下代码添加到 table。请注意,每次只尝试了 1 条路径,而不是同时尝试全部 3 条路径或组合。
public User(UserModel userModel)
{
using (var db = new SqlDogContext())
{
// Path 1 this seem like there is a better way but throws an exception anyways
var sillyModel = new UserModel() { Id = userModel.Id };
db.UserLibarys.Add(new UserLib {User = sillyModel, Libary = RssLibObject});
db.SaveChanges();
db.UserLibarys.Add(new UserLib {User = sillyModel, Libary = KodiLibObject});
db.SaveChanges();
db.UserLibarys.Add(new UserLib {User = sillyModel, Libary = SoundCloudLibObject });
db.SaveChanges();
db.UserLibarys.Add(new UserLib {User = sillyModel, Libary = SpotifyBridgeObject });
db.SaveChanges();
// Path 2 I guess this would be ok
var sillyModel = new UserModel() { Id = userModel.Id };
db.UserLibarys.Add(new UserLib { User = sillyModel, Libary = RssLibObject });
db.UserLibarys.Add(new UserLib { User = sillyModel, Libary = KodiLibObject });
db.UserLibarys.Add(new UserLib { User = sillyModel, Libary = SoundCloudLibObject });
db.UserLibarys.Add(new UserLib { User = sillyModel, Libary = SpotifyBridgeObject });
db.SaveChanges();
// Path 3 - What i want to use..
db.UserLibarys.Add(new UserLib { User = userModel, Libary = RssLibObject });
db.UserLibarys.Add(new UserLib { User = userModel, Libary = KodiLibObject });
db.UserLibarys.Add(new UserLib { User = userModel, Libary = SoundCloudLibObject });
db.UserLibarys.Add(new UserLib { User = userModel, Libary = SpotifyBridgeObject });
db.SaveChanges();
}
}
路径 1 出现以下异常。
{"Violation of PRIMARY KEY constraint 'PK_dbo.UserModels'.
Cannot insert duplicate key in object 'dbo.UserModels'.
The duplicate key value is (009d1c33-a3cf-49db-8243-ff8a447eff16).
\r\nThe statement has been terminated."}
路径 2 出现以下异常。
An exception of type 'System.Data.Entity.Validation.DbEntityValidationException' occurred in EntityFramework.dll but was not handled in user code
使用我在 Whosebug 某处找到的这个。
try
{
// Your code...
// Could also be before try if you know the exception occurs in SaveChanges
db.SaveChanges();
}
catch (DbEntityValidationException e)
{
foreach (var eve in e.EntityValidationErrors)
{
Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State);
foreach (var ve in eve.ValidationErrors)
{
Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage);
}
}
throw;
}
我收到以下消息
The User field is required.
这对我来说意义不大,因为在我看来,我正在提供它。
路径 3 出现以下异常。
Additional information: An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
这让我感到困惑,因为它看起来更新错误 table。 这是我的模特
public class UserLib
{
[Key]
public int LibId { get; set; }
public bool UserEnabled { get; set; }
[Required]
public virtual Lib Libary { get; set; }
[Required]
public virtual UserModel User { get; set; }
}
public class UserModel
{
[Key, ForeignKey("ApplicationUser")]
public string Id { get; set; }
public virtual UserLib Libary { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
}
public class Lib
{
public string Name { get; set; }
public string Logo { get; set; }
[Key]
public int LibId { get; set; }
public virtual UserLib UserLib { get; set; }
}
public class ApplicationUser : IdentityUser
{
public virtual UserModel MyUserModel { get; set; }
// plus some other stuff in here that seems non relavent
}
这是创建用户模型的地方
using (var db = new SqlDogContext())
{
db.UserModels.Add(
new UserModel()
{
Id = currentId
}
);
db.SaveChanges();
query = from b in db.UserModels
where b.Id == currentId
select b;
}
_CurrentUser = new User(query.First());
最终目标是一个用户对应一个用户模型 许多用户库的一个用户模型 并让 UserLibaries 拥有库数据库的外键。
所以我可能犯了一个新手错误,但是有人能看到我的问题吗:)。
您正在尝试设置主键:var sillyModel = new UserModel() { Id = userModel.Id };然后多次存储它,这是你做不到的。让 entity framework 设置主键。另请注意,您不必在每次操作后继续调用 SaveChanges()。您可以执行所有插入操作,然后调用一次。