我有一个Project
实体和一个Rule
实体。一个项目可以有很多规则。
编辑1:以下是我们定义的关系。很抱歉没有在导航属性中使用复数,我们还没有更新它。
所以我有这个方法:
public bool Update(Project project)
{
Logger.Log(GetType(), string.Format("Updating project {0}", project));
using (var ctx = new EntityModelContainer())
{
if (project.Id == 0)
{
return false;
}
try
{
ctx.ProjectSet.Attach(project);
ctx.Entry(project).State = EntityState.Modified;
return ctx.SaveChanges() >= 1;
}
catch (Exception exc)
{
throw new ComplianceException(exc.Message, exc);
}
}
}
它将更新项目的所有标量属性。但是,如果我向项目添加或删除规则并运行Update(project)
,则不予考虑。为什么呢?
编辑2:我还尝试重新阅读项目并分配更新的值。请注意projectRead.Rule
是一个列表。
public bool Update(Project projectGiven)
{
// Add all changes here
Project projectRead = this.ReadProject(projectGiven.Id);
if (projectRead == null)
{
Logger.Log(GetType(), "Project not found");
return false;
}
projectRead.ProjectName = projectRead.ProjectName;
projectRead.Report = projectRead.Report;
projectRead.Rule = projectRead.Rule;
Logger.Log(GetType(), string.Format("Updating project {0}", projectRead));
using (var ctx = new EntityModelContainer())
{
...
非常感谢!
答案 0 :(得分:0)
在我看来,使用最新版本的实体框架,如果已将实体分配给已更改跟踪器中的实体,则实体不会自动添加到更改跟踪器。
显然,这取决于角色和项目的相关方式。
我想更简单的方法是创建一个重新加载项目的过程,包括所有角色,从列表中删除选定的一个,然后保存它,此时我认为更新是相对完成的。< / p>
答案 1 :(得分:0)
我解决了这个问题。我需要在更新之前在相同的上下文中重新加载项目。