带有MVC4的实体框架5

时间:2012-08-31 13:41:44

标签: c# asp.net-mvc-4 entity-framework-5

我正在建立一个拥有相当复杂的SQL数据库的网站 我创建了一个Query类,它包含多个原始字段(一切正常)和多个List<SomeType>SomeType也在我的解决方案中的Models文件夹下定义。它还包含SomeType的单个实例。然后,我创建了一个继承QueryDBContext的{​​{1}}类。

我有一个DbContext函数,它接收一个字符串并创建一个完整形成的Generate实例。如果我立即将它发送到我的Query - 它运行正常。但是,如果我将其存储在我的View中 - 只保留原始值,并且引用类型(DBLists<SomeType>)都是SomeType。 BR />

我认为问题在于EF不支持参考类型 - 或者我可能需要一些特殊的东西呢? 这是null

Query

这是public class Query { [Key] public int id { get; set; } public SomeType Base { get; set; } public List<SomeType> Derived { get; set; } //more of these public string SmallGraphImage { get; set; } public string MediumGraphImage { get; set; } public string LargeGraphImage { get; set; } } public class QueriesDBContext : DbContext { public DbSet<Query> Queries { get; set; } }

SomeType


注意:数据库适用于基元。出于开发目的,我制作了public class SomeType { [Key] public int id { get; set; } public string ExpandedOutForm { get; set; } public string ExpandedInForm { get; set; } //more strings } 删除&amp;为每个修改重建数据库。我还尝试用Controller替换List

如果EF不支持参考类型,我该怎么办?它会在IList上运作吗?如何在数据库条目中存储structs? (是的,我可以用它的ID将它存储在另一个表中 - 但我相信EF有一个更优雅的解决方案)

2 个答案:

答案 0 :(得分:3)

  

我认为问题在于EF不支持引用类型

实体框架确实支持引用类型。使用默认配置,这些将映射到单独的数据库表。在您的情况下,Query_id列将添加到表'SomeTypes'。实体框架将在加载数据时使用它们来创建SQL连接。

您的媒体资源显示为NULL的原因与此无关。它与实体框架如何加载数据有关。默认情况下,EF不会从一开始就加载整个对象图。这意味着如果你的SomeType引用另一个引用另一个类的类,你将在一次调用中加载整个数据库。

您有两种选择:

  • Explicitly loading the references。您告诉实体框架您将提前使用哪些属性,它将在数据库的一次调用中加载它们。

    查询c = ctx.Queries .Include(x =&gt; x.Derived) .Include(x =&gt; x.Base).First();

您可以使用Include方法告诉实体框架将Derived集合作为Base属性加载。

  • 使用延迟加载。这意味着实体框架将在需要时加载您的属性。为此,EF创建了一个包装类的代理类,并将及时执行数据库调用。

    为此,您需要将public SomeType Base { get; set; }声明为虚拟,以便EF可以创建代理并拦截这些调用。

您没有看到数据的唯一原因是因为它未从数据库加载。

答案 1 :(得分:1)

  

我认为问题在于EF不支持引用类型

EF支持引用类型 - 它们实际上映射到其他表。

  

(是的,我可以将它存储在带有ID的另一个表中 - 但我相信EF有一个更优雅的解决方案)

实际上,完全默认情况下EF如何处理1-many关系。你打算如何将它们存储在一个表中?