C# 实体框架6元';除非我中断代码,否则我不会更新记录

C# 实体框架6元';除非我中断代码,否则我不会更新记录,c#,entity-framework,C#,Entity Framework,编辑:这里没有问题,我不知道是否删除该问题。。。据我所知,整件事都是我的错。同时,下面是我的数据库和EntityFramework配置的一些漂亮的图形。和一些数据库表 我的数据库中有以下两个表(其中包括相关表): 在我的应用程序收到GroupMetaData条目之前,SignalMetaData中的GroupId字段可能为空。话虽如此,下面是我的代码,用于在收到SignalMetaData记录后更新该记录,以提供其GroupId字段此。_实体是我的EF对象 /// <summary>

编辑:这里没有问题,我不知道是否删除该问题。。。据我所知,整件事都是我的错。同时,下面是我的数据库和EntityFramework配置的一些漂亮的图形。和一些数据库表

我的数据库中有以下两个表(其中包括相关表):

在我的应用程序收到
GroupMetaData
条目之前,
SignalMetaData
中的
GroupId
字段可能为空。话虽如此,下面是我的代码,用于在收到
SignalMetaData
记录后更新该记录,以提供其
GroupId
字段<代码>此。_实体是我的EF对象

/// <summary>
/// Maps a signal to its group in the database
/// </summary>
/// <param name="signalId">The SignalId</param>
/// <param name="groupId">The identifier of the group that SignalId belongs to.</param>
/// <returns></returns>
public bool InsertSignalGroupMapping(Guid signalId, Guid groupId)
{
    try
    {
        var sig = this._entities.SignalMetaDatas
                                .SingleOrDefault(signal => signal.SignalId == signalId);
        if (sig != null) 
        {
            sig.GroupId = groupId;
            this._entities.SaveChanges();
        }
    }
    catch (Exception ex)
    {
        this._logger.Log(LogSeverity.Error, ex);
        return false;
    }
    return true;
}

使用系统;
使用System.Collections.Generic;
公共部分类元数据
{
公共元数据()
{
this.signalHierarchierarchiesSignalid=new HashSet();
this.SignalHierarchiesParentId=new HashSet();
this.SignalValues=new HashSet();
}
public System.Guid SignalId{get;set;}
公共字符串SignalName{get;set;}
公共可为空的GroupId{get;set;}
公共虚拟GroupMetaData GroupMetaData{get;set;}
公共虚拟ICollection signalid{get;set;}
公共虚拟ICollection signalHierarchysParentID{get;set;}
公共虚拟ICollection信号值{get;set;}
}
和EF配置:


调试环境中可能有一块手表或其他东西正在以某种方式操纵上下文,使其“工作”

标准方法是设置导航属性而不是ID。类似于:

var sig = this._entities.SignalMetaDatas
                        .SingleOrDefault(signal => signal.SignalId == signalId);
var group = this._entities.Groups
                          .SingleOrDefault(g => g.groupId == groupId);

if (sig != null) 
{

    sig.Group = group;
    this._entities.SaveChanges();
}

您的调试环境中可能有一块手表或其他东西正在以某种方式操纵上下文,使其“工作”

标准方法是设置导航属性而不是ID。类似于:

var sig = this._entities.SignalMetaDatas
                        .SingleOrDefault(signal => signal.SignalId == signalId);
var group = this._entities.Groups
                          .SingleOrDefault(g => g.groupId == groupId);

if (sig != null) 
{

    sig.Group = group;
    this._entities.SaveChanges();
}

您的模型中是否也有
sig.Group
导航属性?是的,我有该属性。我忘了提到,但我拼凑了一个解决方案,将一个完全限定的
GroupMetaData
对象也传递给
sig
对象。没什么。你在用.NET4.6吗?因为除非你应用了补丁,否则可能会有一个JIT错误来解释这种情况。你能详细说明这个错误吗?你能创建一个全新的解决方案并添加最简单的代码来重现这个错误吗?你的模型中也有
sig.Group
导航属性吗?是的,我有这个属性。我忘了提到,但我拼凑了一个解决方案,将一个完全限定的
GroupMetaData
对象也传递给
sig
对象。没什么。你在用.NET4.6吗?因为除非你已经应用了补丁,否则可能会有一个JIT错误来解释这种情况。你能详细说明这个错误吗?你能创建一个全新的解决方案并添加最简单的代码来重现这个错误吗?我听说这是“标准”但这需要我在已经有标识符的情况下,额外访问数据库一段时间来获取组对象。更不用说,
InsertSignalGroupMapping
是一个接口的一部分,我特意将它与数据库提供程序分离。以这种方式传递组对象需要我将我的实现与EFAnd结合起来,我很抱歉,我在上面评论说:;d已尝试分配具有相同结果的组导航属性。我将补充我的问题以避免混淆。“以这种方式传递组对象需要我将实现与EF耦合”-我不建议您传递
对象。我建议您将右侧的
加载到上下文中,这会阻止EF尝试创建新的
。我仍然认为您的调试环境中可能有某种东西(如手表)正在操纵您的上下文以使其正常工作。注释的另一部分:“但这需要我在已经有标识符的情况下额外访问数据库以获取组对象。”。。。我尝试从数据库中加载组对象,正如您所做的那样(成功),并得到了相同的结果。我的环境中没有明确定义的手表。唯一可以做同样事情的是我的本地浏览器。我将看到它是什么评估我读到这是“标准”方法,但这需要我额外的时间点击数据库,以便在我已经有标识符的情况下获取组对象。更不用说,
InsertSignalGroupMapping
是一个接口的一部分,我特意将它与数据库提供程序分离。以这种方式传递组对象需要我将我的实现与EFAnd结合起来,我很抱歉,我在上面评论说:;d已尝试分配具有相同结果的组导航属性。我将补充我的问题以避免混淆。“以这种方式传递组对象需要我将实现与EF耦合”-我不建议您传递
对象。我建议您将右侧的
加载到上下文中,这会阻止EF尝试创建新的
。我仍然认为您的调试环境中可能有某种东西(如手表)正在操纵您的上下文以使其正常工作。注释的另一部分:“但这需要我在已经有标识符的情况下额外访问数据库以获取组对象。”。。。我尝试从数据库中加载组对象,正如您所做的那样(成功),并得到了相同的结果。我的环境中没有明确定义的手表。唯一可以做同样事情的是我的本地浏览器。我会看看它在评估什么
var sig = this._entities.SignalMetaDatas
                        .SingleOrDefault(signal => signal.SignalId == signalId);
var group = this._entities.Groups
                          .SingleOrDefault(g => g.groupId == groupId);

if (sig != null) 
{

    sig.Group = group;
    this._entities.SaveChanges();
}