编辑:此处没有问题,我也不知道是否要删除问题 ...根据this comment,整个事情是我的错。在此期间,下面是我的数据库和EntityFramework配置的一些很好的图纸。还有一些数据库表。
我的数据库中有以下两个表(其中包括相关的表):
在我的应用程序收到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
方法的InsertSignalGroupMapping
和Console.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:
答案 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();
}