我是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>();
}
}
答案 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
。