C# MVC“公共虚拟收藏…”

C# MVC“公共虚拟收藏…”,c#,.net,collections,virtual,C#,.net,Collections,Virtual,我是MVC新手。在下面的拍卖课中,有人能解释第8行到第13行的元素吗 public class Auction { public int lngAuctionId { get; set; } public string txtTitle { get; set; } public virtual Collection<Bid> Bids { get; private set; } public Auction() { Bids

我是MVC新手。在下面的拍卖课中,有人能解释第8行到第13行的元素吗

public class Auction
{
    public int lngAuctionId { get; set; }
    public string txtTitle { get; set; }

    public virtual Collection<Bid> Bids { get; private set; }

    public Auction()
    {
        Bids = new Collection<Bid>();
    }
}

第10-13行是构造函数。因此,当您进行拍卖时,variablename=新拍卖;,将执行第12行的代码


第8行声明了一个名为Bids的公共属性,它使用一个泛型集合,其中T是Bid。有关更多信息,请访问谷歌.NET泛型“虚拟”表示该属性可以被子类重写。

该类具有不应从外部设置的集合属性,因此在c'tor中设置私有集合和内部一次性初始化。只能操作集合值


但没有明显的理由将其标记为虚拟

我相信这个类是通过类似于ORM的实体框架存储在数据库中的。使属性为虚拟允许ORM在继承的类中重写此属性。为什么ORM需要这个?允许延迟加载或存储在其他表中的实体

它是如何工作的。您希望在数据库中存储拍卖和出价。关系很简单-拍卖可以有许多出价,即数据库中的出价将有用于拍卖的外键

当您从数据库加载拍卖时,如果启用了延迟加载,则不会加载出价,这是默认情况,否则它可以为单个查询下载整个数据库数据。ORM返回从拍卖中继承的对象。是的,它们仍然是拍卖,但类型不同:

public class DbAuction : Auction
{    
    private DbContext _context;

    public DbAuction(DbContext context)
    {           
        Bids = new Collection<Bid>();
        _context = context;
    }

    public override Collection<Bid> Bids 
    {
        get 
        { 
            // here ORM checks whether this auction has bids loaded
            // and if it hasn't then ORM makes database query
            // and downloads related bids
        } 
        private set { /* ... */ }
    }
}

这不是MVC特有的。但无论如何,virtual关键字允许从拍卖派生的任何类可以覆盖该属性并以任何方式使用它。构造函数初始化并实例化Bids集合。默认情况下,您只能从类外部获取属性,但不能对其进行设置-您只能在类内部进行设置,就像它当前所做的那样。您可能想知道实体框架的延迟加载,这要求属性是虚拟的。你真正的问题是什么,是什么让你问这个问题?
 // this code will return auction of some specific derived type
 // and ORM will load data only from Auctions table
 var auction = context.Auctions.Find(id);
 // and only here due to overridden virtual property
 // ORM will make another call to database and get data from Bids table
 var bids = auction.Bids;