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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.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
Entity framework 未更新复杂类型之间的关系_Entity Framework - Fatal编程技术网

Entity framework 未更新复杂类型之间的关系

Entity framework 未更新复杂类型之间的关系,entity-framework,Entity Framework,因此,使用实体框架,我试图更新两个现有实体 我的主要目标是: public class MainObject { public string Name { get; set; } public virtual SmallObject Part { get; set;} } public class SmallObject { public string Name { get; set; } } 在存储库中,我首先通过以下方式检查数据库中是否已经存在SmallOb

因此,使用实体框架,我试图更新两个现有实体

我的主要目标是:

public class MainObject
{
     public string Name { get; set; }
     public virtual SmallObject Part { get; set;}
}

public class SmallObject 
{
    public string Name { get; set; }
}
在存储库中,我首先通过以下方式检查数据库中是否已经存在SmallObject:

MainObject.Part = (from s in repoSmallObject.GetAll()
            where s.name == MainObject.Part.Name
            select s).FirstOrDefault(); 
最后,我在GenericRepository中调用update方法

repoMainObject.Update(MainObject)
它被定义为通用存储库方法:

dbSet.Attach(entity)
context.Entry(entity).State = EntityState.Modified;

context.SaveChanges();
但这种关系并没有得到更新。为什么呢?两个对象都附加到上下文,不是吗

*编辑:两个回购协议被注入相同的上下文。 奇怪的是,Add方法可以工作并更新关系

当您设置
context.Entry(entity.State=EntityState.Modified
您至少需要设置更新前后的状态(即context.Entry(mainObject).CurrentValues和OriginalValues),以便EF可以构建正确的更新查询(使用right WHERE子句)。 如果设置
context.Entry(entity.State=EntityState.Added
因为EF只需要生成一个插入查询

我不知道您为什么需要它,但通常我更喜欢将对象附加到DbSet并修改属性,以便EF处理各种状态

dbSet.Attach(MainObject)
MainObject.Part = (from s in repoSmallObject.GetAll()
            where s.name == MainObject.Part.Name
            select s).FirstOrDefault(); 
(在您的情况下不起作用,因为MainObject.Part.Name不会更改)

附加对象应具有与数据库相同的值,否则会出现并发异常


顺便说一句,为什么不从数据库中读取旧对象(MainObject)而不处理它呢?

我认为您至少需要将公共SmallObject部分{get;set;}声明为虚拟对象。。。在数据库中,包含零件id的字段是否留空?或者你读起来有问题?你是对的。在我的代码中,它是虚拟的,只是忘记了在这里添加它。该id将填充到数据库中。我也能正确地读出来Yeeh,我用的是互联网上的一个例子。经过一番思考,我只是用了这个旧物体。