通过引用传递给方法的对象不维护来自 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但随后,在"..."之后的代码之后继续在"创建"中,跟踪将返回到其空值。

通过引用传递给方法的对象不维护来自 DBContext 的值

请注意,方法参数是一个新变量。因此,您将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);
    ....