基本上,我将模型对象传递给方法,并在该方法中,从数据库中分配适当的对象。由于这是一个引用,我认为它会在调用/传递它的方法的其余部分持续存在。我知道这与实体框架的代理有关,但无法弄清楚如何解决它。这是代码的一个片段:
[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中加载,但是在' ...'之后的代码之后加载。继续创建,跟踪回到它的空值。
答案 0 :(得分:1)
请注意,方法参数是一个新变量。因此,您将track
(变量)分配给track
(参数)。在方法体中,参数被新引用覆盖,但原始track
(变量)与此无关。
您可能会对以下事实感到困惑:您对相同引用对象所做的更改将在方法体外部显示。如果您只设置new Track()
对象的属性,则在Create_SetTrack
调用后会看到此值。
所以我会创建一个返回轨道的方法,这样你就可以分配给原始变量了。如果这是一个内部方法,您可以返回Tuple
(不建议在API方法中使用Tuple
,因为ItemX
属性太不明白了。
作为替代方案,您可以将轨道分配给另一个未在方法体中覆盖的对象(视图模型?)。
我更喜欢第一种选择。我不喜欢产生副作用的方法。
答案 1 :(得分:0)
除非您使用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);
....