除非我断开代码

时间:2015-08-20 14:09:02

标签: c# entity-framework

编辑:此处没有问题,我也不知道是否要删除问题 ...根据this comment,整个事情是我的错。在此期间,下面是我的数据库和EntityFramework配置的一些很好的图纸。还有一些数据库表。

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

Signals

在我的应用程序收到GroupId条目之前,SignalMetaData中的GroupMetaData字段可能为空。话虽如此,这是我的代码,用于更新SignalMetaData记录,以便在收到GroupId字段后提供该this._entities字段。 /// <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; } 是我的EF对象。

this._entities.SaveChanges();

当我测试我的应用程序时,sig.GroupId = groupId;调用似乎没有做任何事情。我查询数据库并且记录未更新。这种方法从未被调用过。如果我使用SaveChanges()断开该行,然后逐步执行GroupId调用,则没有问题。记录已更新,一切正常。

我尝试在分配SaveChanges()this._entities.Entry(sig).State = EntityState.Modified;来电之间添加此行:

this._entities.SignalMetaDatas.AddOrUpdate(sig);

结果相同。我也尝试过使用此调用来更新记录:

signalId

无济于事。我已经在方法中添加了Console写入,并且没有断点,并且出现了Console写入。正在调用该方法,但除非我断点并手动逐步执行,否则它只是无所事事。

我应该提及的另一件事:传递给groupId方法的InsertSignalGroupMappingConsole.Writeline都不是null或空guid,使用GroupMetaData进行验证。

我还尝试将sig对象上的InsertSignalGroupMapping导航属性分配给一个完全限定的组对象,该对象包含传递给using System; using System.Collections.Generic; public partial class GroupMetaData { public GroupMetaData() { this.GroupHierarchiesParentId = new HashSet<GroupHierarchy>(); this.GroupHierarchiesGroupId = new HashSet<GroupHierarchy>(); this.SignalMetaDatas = new HashSet<SignalMetaData>(); } public System.Guid GroupId { get; set; } public string GroupName { get; set; } public virtual ICollection<GroupHierarchy> GroupHierarchiesParentId { get; set; } public virtual ICollection<GroupHierarchy> GroupHierarchiesGroupId { get; set; } public virtual ICollection<SignalMetaData> SignalMetaDatas { get; set; } } 且具有相同结果的ID。

根据请求,这是两个对象的模型类。

using System;
using System.Collections.Generic;

public partial class SignalMetaData
{
    public SignalMetaData()
    {
        this.SignalHierarchiesSignalId = new HashSet<SignalHierarchy>();
        this.SignalHierarchiesParentId = new HashSet<SignalHierarchy>();
        this.SignalValues = new HashSet<SignalValue>();
    }

    public System.Guid SignalId { get; set; }
    public string SignalName { get; set; }
    public Nullable<System.Guid> GroupId { get; set; }

    public virtual GroupMetaData GroupMetaData { get; set; }
    public virtual ICollection<SignalHierarchy> SignalHierarchiesSignalId { get; set; }
    public virtual ICollection<SignalHierarchy> SignalHierarchiesParentId { get; set; }
    public virtual ICollection<SignalValue> SignalValues { get; set; }
}

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET,
            aUrl, null, new Response.Listener<JSONObject>() {

和EF Config:

EF Config

1 个答案:

答案 0 :(得分:0)

您的调试环境中可能有一块手表或其他东西正在以导致其工作的方式操纵上下文。

标准方法是设置导航属性而不是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();
}