MVC'公共虚拟收藏......'

时间:2013-12-11 06:49:25

标签: c# .net collections virtual

我是MVC的新手。任何人都可以解释以下Auction类中第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>();
    }
}

3 个答案:

答案 0 :(得分:1)

我相信这个类是由ORM(如Entity Framework)存储在数据库中的。使属性虚拟允许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 { /* ... */ }
    }
}

因此,标记为virtual的属性允许添加一些功能以在派生类中获取或设置其值。当您尝试获取属性值时,ORM使用此功能添加从数据库加载的其他数据的功能。

 // 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;

答案 1 :(得分:0)

第10-13行是构造函数。因此,当您执行Auction variablename = new Auction();时,将执行第12行的代码。

第8行声明一个名为Bids的公共属性,它使用通用Collection<T>,其中T是Bid。 (有关详细信息,请参阅Google .NET泛型。)'virtual'表示子类可以覆盖该属性。

答案 2 :(得分:0)

该类具有不应从外部设置的集合属性(因此private set和c'tor中的内部一次性初始化)。只能处理集合值。

但是没有明显的理由将它标记为virtual