通过引用传递给方法的对象不维护来自 DBContext 的值
本文关键字:维护 的值 DBContext 对象 引用 方法 | 更新日期: 2023-09-27 18:30:55
基本上,我将模型对象传递给方法,并在该方法中从数据库中分配正确的对象。由于这是一个引用,我认为它会在调用/传递它的其余方法中持续存在。我知道这与实体框架的代理有关,但无法弄清楚如何解决它。下面是代码片段:
[HttpPost]
public ActionResult Create(NewFormViewModel nfvm)
{
db = new dbconnection(connStr);
Track track= new Track();
Track parentTrack = new Track();
this.Create_SetTrack(nfvm, track, parentTrack);
...
然后在Create_SetTrack:
private void Create_SetTrack(NewFormViewModel nfvm, Track track, Track parentTrack)
{
track = db.Tracks.FirstOrDefault();
parentTrack = db.Tracks.Where(i=>i.ParentID==track.ID).FirstOrDefault();
}
轨道加载Create_SetTrack但随后,在"..."之后的代码之后继续在"创建"中,跟踪将返回到其空值。
请注意,方法参数是一个新变量。因此,您将track
(变量)分配给track
(参数)。在方法主体中,参数被新引用覆盖,但原始track
(变量)与此无关。
您可能会感到困惑,因为对同一引用对象所做的更改将在方法主体之外可见。如果只设置 new Track()
对象的属性,则会在Create_SetTrack
调用后看到此值。
所以我会创建一个返回轨道的方法,这样您就可以将曲目分配给原始变量。如果这是一个内部方法,则可以返回一个Tuple
(不鼓励在 API 方法中使用 Tuple
s,因为ItemX
属性太不可描述)。
作为替代方法,您可以将跟踪分配给在方法主体中未覆盖的另一个对象(视图模型?
不过,我更喜欢第一种选择。我不喜欢产生副作用的方法。
除非您使用 ref
参数,否则这将不起作用。否则,track
参数引用将仅存在于方法的范围内
private void Create_SetTrack(NewFormViewModel nfvm, ref Track track)
{
track = db.Tracks.FirstOrDefault();
}
不过,我建议不要这样做,因为它会使代码更加复杂。更好的解决方案是简单地从方法返回一个值并将其分配给变量:
private Track Create_SetTrack(NewFormViewModel nfvm)
{
return db.Tracks.FirstOrDefault();
}
[HttpPost]
public ActionResult Create(NewFormViewModel nfvm)
{
db = new dbconnection(connStr);
Track track= Create_SetTrack(nfvm);
....