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
C# 实体框架代码优先关系;我错过了什么?_C#_Entity Framework - Fatal编程技术网

C# 实体框架代码优先关系;我错过了什么?

C# 实体框架代码优先关系;我错过了什么?,c#,entity-framework,C#,Entity Framework,我首先在试验EF5代码,然后使用模型(如下所示) 当我查看创建的数据库时,我感到困惑,因为我在Track表中没有看到任何指向Category表的内容。类别有一个指向轨迹的FK,但这意味着会有重复的类别 一点背景:我正在尝试建立一个有轨迹的模型,每个轨迹可以有1到N个类别。所有类别都已经定义,也就是说,它们基本上是一个查找,我计划在创建数据库时在seed方法中创建它们 我想我没有理解一些显而易见的事情。。。当我查询曲目时,我如何知道它包含什么类别 Thx 公共类曲目:IAuditInfo { 公共

我首先在试验EF5代码,然后使用模型(如下所示)

当我查看创建的数据库时,我感到困惑,因为我在Track表中没有看到任何指向Category表的内容。类别有一个指向轨迹的FK,但这意味着会有重复的类别

一点背景:我正在尝试建立一个有轨迹的模型,每个轨迹可以有1到N个类别。所有类别都已经定义,也就是说,它们基本上是一个查找,我计划在创建数据库时在seed方法中创建它们

我想我没有理解一些显而易见的事情。。。当我查询曲目时,我如何知道它包含什么类别

Thx

公共类曲目:IAuditInfo
{
公共Int32 Id{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共字符串数据{get;set;}
public DateTime CreatedOn{get;set;}
公共日期时间修饰符{get;set;}
公共ICollection类别{get;set;}
公共轨道()
{
类别=新列表();
}
}
公共类类别
{
公共Int32 Id{get;set;}
公共布尔值可见{get;set;}
公共字符串DisplayName{get;set;}
}

您当前的模型是曲目和类别之间的一对多关系。 这通常是实现的,正如您所注意到的实体框架所做的那样,使用外键从多面(类别)到单面(轨迹)

如果我理解正确,你想要的是多对多的关系。许多曲目可以与同一类别相关,而单个曲目可以属于多个类别

为了让实体框架理解您想要多对多关系,您可以简单地将ICollection属性添加到您的category类中。 所以两个类都应该有另一个类的集合。 即轨道有许多类别,类别有许多轨道


有关更多信息,您还可以看到:

Olav是正确的,您的数据模型目前并没有告诉Entity Framework其中存在多对多关系

解决此问题的最简单方法是添加

public virtual ICollection<Track> Tracks { get; set; }
如果这样做,则不需要向Category类添加导航属性,但仍然可以(如果这样做,则应使用WithMany的重载,该重载允许您指定属性)

实体之间的关系以及如何将其映射到关系数据库本质上是困难的。对于除最简单的父子关系以外的任何关系,您都需要使用fluentapi来确保您真正得到了想要的

莫特扎·马纳维(Morteza Manavi)首先在EF代码中详细描述了关系

注意 通常应将导航属性设置为虚拟。因此,您应该像这样更改您的
类别
类:

public class MyDb : DbContext
{
    public IDbSet<Track> Tracks { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Track>()
           .HasMany(t => t.Categories)
           .WithMany()
           .Map(c => c.ToTable("CategoriesForTracks"));
    }
} 
public virtual ICollection<Category> Categories { get; set; }
公共虚拟ICollection类别{get;set;}

理论上,不将其虚拟化只会导致急切加载而不是延迟加载。实际上,当我的导航属性不是虚拟的时,我总是会发现很多细微的错误出现。

你没有一个表
TrackCategories
(或类似的)将两者结合起来吗?
Category
将有一个
TrackId
。一个
曲目
有许多
类别
。问题是什么?不,那可能是我的问题。。。我想我需要读更多的内容,因为我完全不知道这一点。你应该在
Category
类中有一个
Track
属性。@Sam Leach当我查看为Track表生成的架构时,没有关于类别的信息:
public virtual ICollection<Category> Categories { get; set; }