EF6 代码首先从数据库添加关系生成

EF 6 Code First Generated From Database adding Releationship

我有一个使用了 nuget 功能的现有数据库 'Code First From Database'

在大多数情况下,它似乎工作得很好。但是,它没有提取数据库具有的所有关键关系。

我有一个名为 Sessions 的 table 和一个名为 Responses 的 table。 Responses table 有一个 SessionId 字段。现在,在旧的 EDMX 模型文件中,会话和响应之间存在 1:* 关系。这样我就可以 foundSession.Responses 获取该会话的响应列表。

数据库中的代码优先未创建 Session.Responses 关系。我在会话模型中添加了一个 ICollection。我怀疑我还需要在 'OnModelCreating' 方法中添加这种关系的设置方式。

我尝试做类似的事情:

 modelBuilder.Entity<Session>()
            .HasMany(e => e.Responses)
            .WithMany().Map(m => m.ToTable("Sessions").MapLeftKey("Id").MapRightKey("SessionId"));

但这没有用。它给了我一个错误:"Invalid object name 'dbo.Sessions1'."

我试图用同样的方法将它从另一行作为基础:

          modelBuilder.Entity<Role>()
            .HasMany(e => e.Users)
            .WithMany(e => e.Roles)
            .Map(m => m.ToTable("RoleUser").MapLeftKey("Roles_Id").MapRightKey("Users_Id"));

但这是多对多的关系。我似乎没有看到 1:many。可能吗?

我不是 100% 确定如何使用 Fluent API,但您可以使用数据注释以这种方式完成:

在你的 Session class:

public virtual ICollection<Response> Responses { get; set; }

在你的 Response class:

[ForeignKey("MySession")]
public int SessionID { get; set; }

public virtual Session MySession { get; set; }

这是一种使用 Fluent 创建一对多关系的方法 Api:

 modelBuilder.Entity<Response>().
   HasRequired(e => e.Session).
   WithMany(s=>s.Responses).
   HasForeignKey(m => m.SessionId);