【问题标题】:Whether to use virtual type with a foreign key using POCO?是否使用 POCO 使用带有外键的虚拟类型?
【发布时间】:2013-03-06 14:07:44
【问题描述】:

我是 Entity Framework 的新手,想知道为什么我的外键属性必须是“虚拟的”,即使可以在没有非虚拟外键的情况下加载数据。

可以说我有两节课。两者都有用 virtual 关键字注释掉的行。数据仍然会在没有虚拟的情况下加载。那我们为什么要使用虚拟呢?一旦我们使用 Context.SaveChanges() 添加/更新/删除记录,它会产生影响吗?

public class Application
{
   public int ApplicationID{get;set;}
   public string Name{get;set;}

   //public virtual ICollection<ApplicationPages> Pages{get;set;}
   public ICollection<ApplicationPages> Pages{get;set;}
}

public class ApplicationPages
{
   public int ApplicationPageID{get;set;}
   public string Name{get;set;}

   public int ApplicationID{get;set;}
   [ForeignKey("ApplicationID")]
   public Application Application{get;set;}
   //public virtual Application Application{get;set;}
}

【问题讨论】:

    标签: entity-framework-4.3


    【解决方案1】:

    据我了解,需要 virtual 关键字才能允许 Entity Framework 代理您的类,这有助于延迟加载情况。

    我不知道代理变体的详细信息,但我猜它会带回并将子 ID 与父代一起存储。然后,如果您随后访问子属性(除了 id),它有一种获取子记录的有效方法。

    我在父级的导航属性方面遇到了问题,因此将它们排除在外,以便在需要时显式加载子记录。但是,我的密钥是两部分(ID 和生效日期),这可能是原因。

    【讨论】:

    • 感谢您这么快回复。实际上,我问这个问题的原因是,我正在开发的应用程序正在使用实体框架 4.3,并且我禁用了延迟加载和使用延迟加载。我的类具有导航属性,但它们不是作为“虚拟”创建的。一切正常,但更新功能让我很难过。每当我更新父行时,子行就会重复。所以我想知道可能是因为我没有使用 Virtual 作为关键字 Entity Framework 松散地跟踪我的上下文,并认为子对象中发生了一些变化并将它们作为新行插入。跨度>
    • 是的,我相信虚拟标签也用于解决对象图中的 FK 关系,这可能解释了重复项 - 听起来 EF 没有将您的 Pages 集合中的项目视为更新,所以它而是插入它们。请参阅此 url slideshare.net/JulieLerman/… 的幻灯片 6,显示代理参与检测更改。关键是,如果你不使用 virtual,你将不会得到代理类。这是一个相当复杂的领域,搜索 Julie Lerman 的博客以获得更好的解释,或者查看她的书籍。
    • 感谢您的回复,并为我指明了正确的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2022-11-11
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多