Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有MVC4的实体框架5_C#_Asp.net Mvc 4_Entity Framework 5 - Fatal编程技术网

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
}