Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
SQL中的高级嵌套(层次结构)_Sql_Entity Framework_Hierarchical Data - Fatal编程技术网

SQL中的高级嵌套(层次结构)

SQL中的高级嵌套(层次结构),sql,entity-framework,hierarchical-data,Sql,Entity Framework,Hierarchical Data,我已经读了很多关于层次结构、树、组合键和SQL中更多问题的帖子,但是我找不到我需要的信息。我正在使用EF6和SQL,C# 案例: 假设我有以下模型。因此,应用程序可以在这些平台中的每一个平台上(或者只在其中的一个或两个平台上。应用程序将是一个基类,如果从代码中说话,OSX、windows和PlatformX将继承他)。但应用程序可以对每个平台进行审查,审查可能适用于多个平台。所以我尝试建立一个数据库模型,它不需要在3个不同的表中分离评论 有人有没有关于如何在sql数据库中对此进行建模的好例子?

我已经读了很多关于层次结构、树、组合键和SQL中更多问题的帖子,但是我找不到我需要的信息。我正在使用EF6和SQL,C#

案例:

假设我有以下模型。因此,应用程序可以在这些平台中的每一个平台上(或者只在其中的一个或两个平台上。应用程序将是一个基类,如果从代码中说话,OSX、windows和PlatformX将继承他)。但应用程序可以对每个平台进行审查,审查可能适用于多个平台。所以我尝试建立一个数据库模型,它不需要在3个不同的表中分离评论

有人有没有关于如何在sql数据库中对此进行建模的好例子?或者这不可能吗

一些必要的查询将是: -获取应用程序的所有指定类型(OSX、winodws等)? -获取应用程序类型的所有审阅。 -获取应用程序的所有审核。
-通过审查获取所有申请。(然后我能找出它是哪种类型吗?

据我所知,
应用程序
OSX
Windows
PlatformX
的基本实体

我的第一句话是,如果您的
~Value
字段是每个组件的特定于平台的字段,比如

-----------  ------------------
| Windows |  | OSX            |
-----------  -----------------|
| WinApi  |  | SupportsMobile |
| TempDir |  | WrittenLang    |
-----------  ------------------
然后,您可能希望为
应用程序
创建一个表,其主键将是一个标识字段。其他实体建议为单独的表,但将使用
应用程序的主键作为它们自己的主键,即一对一关系

如果上述情况不适用于您的情况,并且您的表将具有
Value1
Value2
Value3
以及相同的数据类型,那么我强烈建议您将所有类合并到一个表中,并添加整数标志
Platform
。因此,您最终只会得到两个表,它们真正简化了您的工作,并且不会截断功能

但是,两种情况下,通过审查解决您的案例是相同的。我建议您将
应用程序
表格连接到
查看
表格,这将为您节省大量时间

你所有的问题:是的,你可以做所有的问题

编辑

好吧,让我给你看看我的愿景

应用程序(ApplicationId,名称,价格,命名空间)
OSX(ApplicationId*,OSXValue1,OSXValue2,OSXValue3)
Windows(ApplicationId*,WindowsValue1,WindowsValue2,WindowsValue3)
PlatformX(ApplicationId*,XValue1,XValue2,XValue3)
回顾(回顾ID,应用程序ID*,全名,回顾文本)

NB请注意,我使用PascalCase作为字段名。这是使用EF的一个很好的约定,因为字段将映射到属性名称(按约定),并且不会破坏.NET应用程序中的整体命名

此处,
Application
表中的
ApplicationId
是一个标识字段,是主键。在表
OSX
Windows
PlatformX
中定义
ApplicationId
字段,将其定义为主键,外键引用
Application
表中的
ApplicationId
字段

这就是你储存它的方式

作为实体框架 按如下方式定义您的类

public class Application {
    private ICollection<Review> _Reviews;
    public Int64 ApplicationId { get; set; }
    /*Other fields*/
    public Windows Windows { get; set; }
    public Osx Osx { get; set; }
    public PlatformX PlatformX { get; set; }
    public ICollection<Review> Reviews {
        get { return _Reviews = _Reviews ?? new List<Review>(); }
        set { _Reviews = value; }
    }
}

public class Osx {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [ForeignKey("Application")]
    public Int64 ApplicationId { get; set; }
    /*Other fields*/
    public Application Application { get; set; }
}

public class PlatformX {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [ForeignKey("Application")]
    public Int64 ApplicationId { get; set; }
    /*Other fields*/
    public Application Application { get; set; }
}

public class Windows {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [ForeignKey("Application")]
    public Int64 ApplicationId { get; set; }
    /*Other fields*/
    public Application Application { get; set; }
}

public class Review {
    public Int64 ReviewId { get; set; }
    public Int64 ApplicationId { get; set; }
    /*Other fields*/
    //Convention will catch up the ApplicationId field automatically
    public Application Application { get; set; }
}
这是对应用程序的查询,通过查看其类型

var res2 = context.Reviews.Select(x => new {
    x.Application,
    IsOsx = x.Application.Osx != null,
    IsWindows = x.Application.Windows != null,
    IsPlatformX = x.Application.PlatformX != null
});

您可以根据对象中的布尔值找出类型。

首先,是的,您很了解我。Windows和OSx等。。将有不同的字段,并且是特定于平台的。第二,您是说将评论连接到应用程序表?但是,在这种情况下,您如何知道审查属于哪种应用程序类型(windows、osx等)?因为Windows可能有两个评论,其中一个也属于OSX。你能在这方面多合作一点吗?另一个大问题是,这一切对EF6有效吗。或者EF6不能做到这一点吗?一般来说,EF6极大地扩展了开发人员的能力。您必须深入了解
IQueryable
和表达式,并进行一些练习以找出最佳方法。LINQ很棒,你必须去探索它。我真的很喜欢你的榜样和你的承诺:)你已经帮了我很多!但我有一个疑问。A.t.m.审查属于所有平台。我的目的是使这个变量。Windows和OSX上都有应用程序,这一事实并不意味着审查属于所有这些应用程序。但是也应该只能属于OSX。这可以通过审查中的一些布尔字段来解决……但是没有更简单的方法吗?有很多解决方案,您可以使用整数指示器向审查中添加一个字段,或者您可以审查每种平台类型的表,您可以为每个表添加RevievedApplicationID。但永远不要对所有表使用一个字段。
var res2 = context.Reviews.Select(x => new {
    x.Application,
    IsOsx = x.Application.Osx != null,
    IsWindows = x.Application.Windows != null,
    IsPlatformX = x.Application.PlatformX != null
});