我正在建立一个拥有相当复杂的SQL
数据库的网站
我创建了一个Query
类,它包含多个原始字段(一切正常)和多个List<SomeType>
。 SomeType
也在我的解决方案中的Models
文件夹下定义。它还包含SomeType
的单个实例。然后,我创建了一个继承QueryDBContext
的{{1}}类。
我有一个DbContext
函数,它接收一个字符串并创建一个完整形成的Generate
实例。如果我立即将它发送到我的Query
- 它运行正常。但是,如果我将其存储在我的View
中 - 只保留原始值,并且引用类型(DB
和Lists<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有一个更优雅的解决方案)
答案 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关系。你打算如何将它们存储在一个表中?