2012-08-31 218 views
0

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

实体框架5与MVC4

我有一个Generate函数,它接收一个字符串并创建一个完全形成的Query实例。如果我立即将它发送到我的View - 它工作正常。但是,如果我将它存储在我的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,它删除了&为每次修改重建数据库。我也试着用IList替换List

如果EF不支持引用类型,我该怎么办?它会在structs上运行吗?如何将Lists存储在数据库条目中? (是的,我可以把它存储在其ID另一个表 - 但我相信,英孚已经为这个更好的解决方案)

+0

您不能在数据库字段中存储列表。数据库字段可以包含一个值,但不包含值的数组。如果您需要引用父项中的一组值,那么您基本上正在讨论具有一对多引用。 –

+0

那么,我该如何做一对多的参考? –

回答

3

我相信问题是,EF不支持引用类型

实体框架不支持引用类型。使用默认配置,这些将映射到单独的数据库表。在你的情况下,一个Query_id列将被添加到'SomeTypes'表中。加载数据时,实体框架将使用这些来创建SQL联接。

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

你有两个选择:

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

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

在这里使用Include方法来告诉实体框架加载两个你Derived集合作为Base财产。

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

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

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

+0

没想过,我会尝试一下,看看它是否工作。 –

+0

是的 - 它的工作原理。谢谢! –

1

我相信问题是,EF不支持引用类型

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

(是的,我可以把它存储在其ID另一个表 - 但我相信,英孚已经为这个更好的解决方案)

其实that'e 究竟如何 EF处理1-许多关系默认。你打算如何将它们存储在一张表中?

+0

当然,EF存储在不同的表* *内部*,我的问题是:如何重写我的类结构,因此它将工作?编辑:因此,EF将创建适当的数据库,并保存结果... –