为什么我需要在c#类中使用虚拟修饰符
本文关键字:虚拟 为什么 | 更新日期: 2023-09-27 18:28:03
我有以下类:
public class Delivery
{
// Primary key, and one-to-many relation with Customer
public int DeliveryID { get; set; }
public virtual int CustomerID { get; set; }
public virtual Customer Customer { get; set; }
// Properties
string Description { get; set; }
}
有人能解释为什么他们的客户信息是用虚拟编码的吗。这是什么意思?
根据评论判断,您正在学习实体框架?
这里的虚拟意味着你试图使用延迟加载——当像Customer这样的相关项目可以由EF自动加载时
http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx
例如,当使用下面定义的Princess实体类时,相关的独角兽将在第一次访问独角兽导航属性时加载:
public class Princess
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Unicorn> Unicorns { get; set; }
}
有人能解释为什么他们的客户信息是用虚拟编码的吗。这是什么意思?
virtual关键字意味着从此基类派生的超类(即Delivery)可以覆盖该方法。
如果该方法未标记为虚拟,则将无法覆盖该方法。
猜测您正在使用EF。
当您使NavigationProperty
虚拟化时,EF会动态地创建一个派生类
该类实现了允许延迟加载和其他任务的功能,如维护EF为您执行的关系。
只是为了让你的示例类动态地变成这样:
public class DynamicEFDelivery : Delivery
{
public override Customer Customer
{
get
{
return // go to the DB and actually get the customer
}
set
{
// attach the given customer to the current entity within the current context
// afterwards set the Property value
}
}
}
在调试时可以很容易地看到这一点,EF类的实际实例类型有非常奇怪的名称,因为它们是动态生成的。