为啥属性都用 virtual啊?

WithLin 2017-04-17 01:57:04
public class Person : Entity
{
public virtual string Name { get; set; }

public virtual DateTime CreationTime { get; set; }

public Person()
{
CreationTime = DateTime.Now;
}
}
我们用的是EF,是POCO Proxies???还是什么啊?为啥要用 virtual?
因为POCO ,EF采用动态proxy处理??
Customer cus = cusreporsitory.Get(...);
cus.Name = "xxx";
uow.Commit();
为啥uow(Unit Of Work模式)知道cus被修改??
定义virtual 是EF ORM的机制吗?
...全文
1170 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2017-04-18
  • 打赏
  • 举报
回复
引用 21 楼 WithLin 的回复:
在上文 听你说你有你的框架,基于DDD实现的吗?能否探讨下?
没有采用领域驱动的设计方案,只是增加了仓储的设计。
WithLin 2017-04-18
  • 打赏
  • 举报
回复
引用 20 楼 hanjun0612 的回复:
[quote=引用 17 楼 WithLin 的回复:] 不是这样的 EF有个 跟踪的机制,楼上也说的很明白了。更改跟踪代理 关键字必须virtual,他是有作用的。 这是POCO代理的要求。
我仔细看了一下poco代理的要求。的确像你说的。 对于更改跟踪代理: 映射到数据模型中实体类型属性的每个属性必须具有非密封(在 Visual Basic 中为 NotOverridable)、public 和 virtual(在 Visual Basic 中为 Overridable)get 和 set 访问器。 那么[/quote] 没有 探讨 就没有进步 技术就该这样。谢谢了
WithLin 2017-04-18
  • 打赏
  • 举报
回复
引用 18 楼 hanjun0612 的回复:
[quote=引用 17 楼 WithLin 的回复:] 不是这样的 EF有个 跟踪的机制,楼上也说的很明白了。更改跟踪代理 关键字必须virtual,他是有作用的。 这是POCO代理的要求。
如果你直接用ef以db first 的方式来生成,那么你会发现其实属性也是不会默认带上virtual的。 在我理解,他内部的跟踪机制,是跟踪的这个对象的引用。[/quote] 在上文 听你说你有你的框架,基于DDD实现的吗?能否探讨下?
正怒月神 2017-04-18
  • 打赏
  • 举报
回复
引用 17 楼 WithLin 的回复:
不是这样的 EF有个 跟踪的机制,楼上也说的很明白了。更改跟踪代理 关键字必须virtual,他是有作用的。 这是POCO代理的要求。
我仔细看了一下poco代理的要求。的确像你说的。 对于更改跟踪代理: 映射到数据模型中实体类型属性的每个属性必须具有非密封(在 Visual Basic 中为 NotOverridable)、public 和 virtual(在 Visual Basic 中为 Overridable)get 和 set 访问器。 那么
WithLin 2017-04-18
  • 打赏
  • 举报
回复
引用 18 楼 hanjun0612 的回复:
[quote=引用 17 楼 WithLin 的回复:] 不是这样的 EF有个 跟踪的机制,楼上也说的很明白了。更改跟踪代理 关键字必须virtual,他是有作用的。 这是POCO代理的要求。
如果你直接用ef以db first 的方式来生成,那么你会发现其实属性也是不会默认带上virtual的。 在我理解,他内部的跟踪机制,是跟踪的这个对象的引用。[/quote] 你所说的对象的引用是倾向于 Lazy Loading的。 https://msdn.microsoft.com/en/library/dd468057.aspx http://stackoverflow.com/questions/8542864/why-use-virtual-for-class-properties-in-entity-framework-model-definitions 看下以上两个文章
正怒月神 2017-04-18
  • 打赏
  • 举报
回复
引用 17 楼 WithLin 的回复:
不是这样的 EF有个 跟踪的机制,楼上也说的很明白了。更改跟踪代理 关键字必须virtual,他是有作用的。 这是POCO代理的要求。
如果你直接用ef以db first 的方式来生成,那么你会发现其实属性也是不会默认带上virtual的。 在我理解,他内部的跟踪机制,是跟踪的这个对象的引用。
WithLin 2017-04-18
  • 打赏
  • 举报
回复
引用 16 楼 hanjun0612 的回复:
[quote=引用 8 楼 WithLin 的回复:] Lazy Loding 我倒是知道,就是我觉的属性加virtual是否有必要, 不知道其目的是什么,还是说EF的内部的机制,所以想问一下,在一些群里问 ,都说是重写他们,所以去查阅了一些资料,也在csdn上问问大神!
对于属性来说,没有必要。可能只是个人习惯问题。 我的框架里,没有对属性增加过这个。只有关联集合才会增加,也只是为了延迟加载[/quote] 不是这样的 EF有个 跟踪的机制,楼上也说的很明白了。更改跟踪代理 关键字必须virtual,他是有作用的。 这是POCO代理的要求。
WithLin 2017-04-18
  • 打赏
  • 举报
回复
引用 23 楼 hanjun0612 的回复:
[quote=引用 21 楼 WithLin 的回复:] 在上文 听你说你有你的框架,基于DDD实现的吗?能否探讨下?
没有采用领域驱动的设计方案,只是增加了仓储的设计。[/quote] 有github address?
正怒月神 2017-04-17
  • 打赏
  • 举报
回复
引用 8 楼 WithLin 的回复:
Lazy Loding 我倒是知道,就是我觉的属性加virtual是否有必要, 不知道其目的是什么,还是说EF的内部的机制,所以想问一下,在一些群里问 ,都说是重写他们,所以去查阅了一些资料,也在csdn上问问大神!
对于属性来说,没有必要。可能只是个人习惯问题。 我的框架里,没有对属性增加过这个。只有关联集合才会增加,也只是为了延迟加载
WithLin 2017-04-17
  • 打赏
  • 举报
回复
引用 14 楼 duanzi_peng 的回复:
#7 说的也没错,也可以用于导航属性的延迟加载,也就是按需加载数据。
Lazy Loding 我倒是知道,就是我觉的属性加virtual是否有必要, 不知道其目的是什么,还是说EF的内部的机制,所以想问一下,在一些群里问 ,都说是重写他们,所以去查阅了一些资料,也在csdn上问问大神!
exception92 2017-04-17
  • 打赏
  • 举报
回复
#7 说的也没错,也可以用于导航属性的延迟加载,也就是按需加载数据。
exception92 2017-04-17
  • 打赏
  • 举报
回复
引用 11 楼 WithLin 的回复:
[quote=引用 10 楼 duanzi_peng 的回复:] 虚拟属性不是必需的,但是它们给EF提供了一个指向纯C#类集的一个钩子,并为EF启用了一些新特性,比如高效的修改跟踪机制。 EF 需要知道模型属性修改的时刻,来生成并执行一个sql update语句。
因为POCO EF采用动态proxy处理,所以uow中的trackobjects實際上就是那些繼承對象, 而傳回給用戶,所以EF就可以再繼承對象中做手腳,透過virtual改寫, EF就能知道那些屬性被修改,進而紀錄,最終就能知道哪些對象 那些屬性被修改過, 產生對應的SQL語法 这种说话对的?[/quote] 可以这么讲吧
WithLin 2017-04-17
  • 打赏
  • 举报
回复
引用 10 楼 duanzi_peng 的回复:
虚拟属性不是必需的,但是它们给EF提供了一个指向纯C#类集的一个钩子,并为EF启用了一些新特性,比如高效的修改跟踪机制。 EF 需要知道模型属性修改的时刻,来生成并执行一个sql update语句。
您这些话是从哪里看到的呢?有书本推荐?
WithLin 2017-04-17
  • 打赏
  • 举报
回复
引用 10 楼 duanzi_peng 的回复:
虚拟属性不是必需的,但是它们给EF提供了一个指向纯C#类集的一个钩子,并为EF启用了一些新特性,比如高效的修改跟踪机制。 EF 需要知道模型属性修改的时刻,来生成并执行一个sql update语句。
因为POCO EF采用动态proxy处理,所以uow中的trackobjects實際上就是那些繼承對象, 而傳回給用戶,所以EF就可以再繼承對象中做手腳,透過virtual改寫, EF就能知道那些屬性被修改,進而紀錄,最終就能知道哪些對象 那些屬性被修改過, 產生對應的SQL語法 这种说话对的?
exception92 2017-04-17
  • 打赏
  • 举报
回复
虚拟属性不是必需的,但是它们给EF提供了一个指向纯C#类集的一个钩子,并为EF启用了一些新特性,比如高效的修改跟踪机制。 EF 需要知道模型属性修改的时刻,来生成并执行一个sql update语句。
WithLin 2017-04-17
  • 打赏
  • 举报
回复
引用 7 楼 hanjun0612 的回复:
ef 中 属性的virtual应该没什么特别的。 主要是关联对象如果带有 virtual才能起到延迟加载的作用。 至于单元提交怎么知道cus被修改,那是因为ef在查询时,对其有跟踪(这也是有时会报错:已经具有跟踪的目标)
http://stackoverflow.com/questions/8542864/why-use-virtual-for-class-properties-in-entity-framework-model-definitions 这篇文章 有回答 You can and should use lazy loading and change tracking features for your navigation properties in many scenarios though. 或者说是change tracking features?
WithLin 2017-04-17
  • 打赏
  • 举报
回复
引用 7 楼 hanjun0612 的回复:
ef 中 属性的virtual应该没什么特别的。 主要是关联对象如果带有 virtual才能起到延迟加载的作用。 至于单元提交怎么知道cus被修改,那是因为ef在查询时,对其有跟踪(这也是有时会报错:已经具有跟踪的目标)
uow中有個trackobjects清單, 所有從數據庫讀出的對象都會用"一種方式" 複製一分到這清單, 因为POCO EF采用动态proxy处理,所以uow中的trackobjects實際上就是那些繼承對象, 而傳回給用戶,所以EF就可以再繼承對象中做手腳,透過virtual改寫, EF就能知道那些屬性被修改,進而紀錄,最終就能知道哪些對象 那些屬性被修改過, 產生對應的SQL語法 是这样? 还是说 uow实现的方式 有很多种这是其中的一种?
正怒月神 2017-04-17
  • 打赏
  • 举报
回复
ef 中 属性的virtual应该没什么特别的。 主要是关联对象如果带有 virtual才能起到延迟加载的作用。 至于单元提交怎么知道cus被修改,那是因为ef在查询时,对其有跟踪(这也是有时会报错:已经具有跟踪的目标)
大鱼> 2017-04-17
  • 打赏
  • 举报
回复
引用 5 楼 WithLin 的回复:
[quote=引用 2 楼 qq_17486399 的回复:] virtual 是表示虚方法,其子类可以进行重写。不过你这不应该是父类啊。
你这样想的是不是简单了?[/quote] 我也觉得这样是有问题,你这明显不是父类,就当帮你顶一下帖子吧
WithLin 2017-04-17
  • 打赏
  • 举报
回复
引用 2 楼 qq_17486399 的回复:
virtual 是表示虚方法,其子类可以进行重写。不过你这不应该是父类啊。
你这样想的是不是简单了?
加载更多回复(4)

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧