C# 带有MVC4的实体框架5
我正在用一个相当复杂的C# 带有MVC4的实体框架5,c#,asp.net-mvc-4,entity-framework-5,C#,Asp.net Mvc 4,Entity Framework 5,我正在用一个相当复杂的SQL数据库构建一个网站。 我创建了一个查询类,它包含多个基本字段(所有字段都可以正常工作)和多个列表SomeType也在我的解决方案中的Models文件夹下定义。它还保存SomeType的单个实例。然后,我创建了一个QueryDBContext类,它继承了DbContext 我有一个Generate函数,它接收一个字符串并创建一个完整格式的Query实例。如果我立即将它发送到我的视图,它可以正常工作。但是如果我将其存储在我的DB,则只保留原语值,并且引用类型(包括列表和S
SQL
数据库构建一个网站。我创建了一个
查询
类,它包含多个基本字段(所有字段都可以正常工作)和多个列表
SomeType
也在我的解决方案中的Models
文件夹下定义。它还保存SomeType
的单个实例。然后,我创建了一个QueryDBContext
类,它继承了DbContext
我有一个
Generate
函数,它接收一个字符串并创建一个完整格式的Query
实例。如果我立即将它发送到我的视图
,它可以正常工作。但是如果我将其存储在我的DB
,则只保留原语值,并且引用类型(包括列表
和SomeType
)为null
我认为问题在于EF不支持引用类型,或者我需要一些特殊的引用类型 这里是
查询
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; }
}
注意:对于原语,数据库工作正常。出于开发目的,我制作了一个
控制器
,它为每次修改删除并重建数据库。我还尝试将列表
替换为IList
如果EF不支持引用类型,我该怎么办?它能在结构上工作吗?如何在数据库条目中存储
列表
?(是的,我可以用它的ID将它存储在另一个表中-但我相信EF有一个更优雅的解决方案)
我认为问题在于EF不支持引用类型
EF支持引用类型-它们基本上映射到其他表
(是的,我可以用它的ID将它存储在另一个表中-但我相信EF有一个更优雅的解决方案)
实际上,这正是EF在默认情况下处理一对多关系的方式。您打算如何将这些存储在单个表中
我认为问题在于EF不支持引用类型
EF支持引用类型-它们基本上映射到其他表
(是的,我可以用它的ID将它存储在另一个表中-但我相信EF有一个更优雅的解决方案)
实际上,这正是EF在默认情况下处理一对多关系的方式。您打算如何将这些存储在单个表中
我认为问题在于EF不支持引用类型
实体框架不支持引用类型。使用默认配置,这些将映射到一个单独的数据库表。在您的情况下,查询id列将添加到表“SomeTypes”中。实体框架将在加载数据时使用它们来创建SQL连接
属性显示为NULL
的原因与此无关。它与实体框架如何加载数据有关。默认情况下,EF不会从一开始就加载整个对象图。这意味着如果您的SomeType
引用了另一个类,而该类引用了另一个类。。。您可以在一次调用中加载整个数据库
您有两个选择:
- 。您提前告诉实体框架您将使用哪些属性,它将在一次数据库调用中加载这些属性 查询c=ctx.querys .Include(x=>x.Derived) .Include(x=>x.Base).First()
Include
方法告诉实体框架将派生的集合作为基本属性加载
- 使用延迟加载。这意味着实体框架将在需要时加载您的属性。为此,EF创建了一个代理类来包装您的类,并将及时执行数据库调用
要使其工作,您需要将
publicsometypebase{get;set;}
声明为virtual,以便EF可以创建代理并拦截这些调用
您无法看到数据的唯一原因是,它不是从数据库加载的
我认为问题在于EF不支持引用类型
实体框架不支持引用类型。使用默认配置,这些将映射到一个单独的数据库表。在您的情况下,查询id列将添加到表“SomeTypes”中。实体框架将在加载数据时使用它们来创建SQL连接
属性显示为NULL
的原因与此无关。它与实体框架如何加载数据有关。默认情况下,EF不会从一开始就加载整个对象图。这意味着如果您的SomeType
引用了另一个类,而该类引用了另一个类。。。您可以在一次调用中加载整个数据库
您有两个选择:
- 。您提前告诉实体框架您将使用哪些属性,它将在一次数据库调用中加载这些属性
查询c=ctx.querys
.Include(x=>x.Derived)
.Include(x=>x.Base).First()
这里使用Include
方法告诉实体框架将派生的集合作为基本属性加载
- 使用延迟加载。这意味着实体框架将在需要时加载您的属性。为此,EF创建了一个代理类来包装您的类,并将及时执行数据库调用
要使其工作,您需要将
publicsometypebase{get;set;}
声明为virtual,以便EF可以创建代理并拦截这些调用
无法查看数据的唯一原因是数据不是从数据库加载的。不能在数据库字段中存储列表。数据库字段可以保存值,但不能保存值数组。如果需要引用父项中的值数组,基本上是指一对多引用。因此,
public class SomeType
{
[Key]
public int id { get; set; }
public string ExpandedOutForm { get; set; }
public string ExpandedInForm { get; set; }
//more strings
}