Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架更新记录时出错_C#_Entity Framework - Fatal编程技术网

C# 使用实体框架更新记录时出错

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; }

当我尝试更新记录时,出现以下错误:

INSERT语句与外键约束冲突 \“FK_dbo.User_dbo.House_IdHouse\

我的代码:

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;