0

我正在建立一个具有相当复杂SQL数据库的网站。
我创建了一个Query类,它包含多个原始字段(都可以正常工作)以及多个List<SomeType>. 也在我的解决方案SomeType的文件夹下定义。Models它还包含SomeType. 然后,我创建了一个QueryDBContext继承DbContext.

我有一个Generate函数,它接收一个字符串并创建一个完整的Query实例。如果我立即将它发送到我的View- 它工作正常。但是,如果我将它存储在 my DB- 中,则只保留原始值,并且引用类型(Lists<SomeType>SomeType)都是null.

我相信问题在于 EF 不支持引用类型 - 或者我可能需要一些特殊的东西来处理这种情况?
这里是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
}


注意:数据库适用于原语。出于开发目的,我做了一个Controller删除和重建每次修改的数据库。我也尝试ListIList.

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

4

2 回答 2

3

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

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

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

你有两个选择:

  • 显式加载引用。您提前告诉实体框架您要使用哪些属性,它会在一次调用中从数据库中加载它们。

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

在这里,您使用该Include方法告诉 Entity Framework 将您的Derived集合加载为您的Base属性。

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

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

您看不到数据的唯一原因是它不是从数据库中加载的。

于 2012-08-31T14:03:23.733 回答
1

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

EF 支持引用类型——它们本质上映射到其他表。

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

实际上,这正是EF 默认处理一对多关系的方式。您打算如何将它们存储在一个表中?

于 2012-08-31T13:49:28.707 回答