C# 使用实体框架更新记录时出错
当我尝试更新记录时,出现以下错误: INSERT语句与外键约束冲突 \“FK_dbo.User_dbo.House_IdHouse\ 我的代码:C# 使用实体框架更新记录时出错,c#,entity-framework,C#,Entity Framework,当我尝试更新记录时,出现以下错误: INSERT语句与外键约束冲突 \“FK_dbo.User_dbo.House_IdHouse\ 我的代码: public class User { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int IdUser { get; set; } public int? IdHouse { get; set; }
public class User
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int IdUser { get; set; }
public int? IdHouse { get; set; }
[ForeignKey("IdHouse")]
public virtual House House { get; set; }
//--- other fields
}
public class House
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int IdHouse { get; set; }
public string Code { get; set; }
public virtual ICollection<User> Users { get; set; }
//--- other fields
}
我根本没有更新房产,但是我感觉它试图插入一栋新房子
此查询返回3条记录。前2条记录链接了“House”,最后一条记录的“House”属性设置为null
我还试图分别更新每一条记录
UpdateMany
函数:
public void UpdateMany(IList<T> entities)
{
foreach (var entity in entities)
{
Update(entity);
}
}
public virtual void Update(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State == EntityState.Detached)
{
DbSet.Attach(entity);
}
dbEntityEntry.State = EntityState.Modified;
}
我正在使用.NET4.0和EntityFramework6
更新
运行SQL profiler时,我发现一些奇怪的情况,应用程序尝试更新然后插入。
虽然我没有做任何插入
更新:
exec sp_executesql N'UPDATE[dbo].[User]SET[DSL]=@0[TPL]=@1,
[DFD]=@2[IdProff]=@3[IdHouse]=@4其中([IdUser]=@5)
,N'@0浮点、@1浮点、@2浮点、@3整数、@4整数、@5整数、,
@0=0,041837288150243422,@1=462,76900000000001,
@2=19,360999999999997,@3=3354,@4=17@5=3354
插入:
exec sp_executesql N'INSERT[dbo].[IdUser]([DSL]、[TPL]、[DFD],
[IdProff],[IdHouse]值(@0、@1、@2、@3、@4)从中选择[IdUser]
[dbo].[IdUser]其中@@ROWCOUNT>0和[IdUser]=
作用域标识(),N'@0浮点、@1浮点、@2浮点、@3整数、@4整数、,
@0=0,91810000000000003,@1=460,11399999999998,@2=19,792000000000002,@3=3197,@4=0
@5=不属于“用户”
为什么应用程序试图插入
更新:
我的上下文设置
DbContext.Configuration.ProxyCreationEnabled = true;
DbContext.Configuration.LazyLoadingEnabled = true;
DbContext.Configuration.ValidateOnSaveEnabled = false;
DbContext.Configuration.AutoDetectChangesEnabled = false;
在数据库定义中HouseID可以为null吗?您可能想看一看。它们很好地解释了错误发生的原因。虽然这是纯SQL术语,但您应该能够利用这些知识确定代码中的问题。是的,它可以为null您有两种可能性:当您填充IdHouse时,您的ViewModel或其他D您正在使用的设置为无效值。或者,DTO将属性值设置为不可为null,然后将其设置为默认值int,0。我怀疑您的接口和代码之间存在类型转换,该转换正在将“IdHouse”=null(可能是另一个外键)转换为“0”,然后尝试插入0?
public virtual void Update(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
dbEntityEntry.State = EntityState.Modified;
}
DbContext.Configuration.ProxyCreationEnabled = true;
DbContext.Configuration.LazyLoadingEnabled = true;
DbContext.Configuration.ValidateOnSaveEnabled = false;
DbContext.Configuration.AutoDetectChangesEnabled = false;