Entity framework 实体框架将一对多映射到一个中间表,而该表没有类

Entity framework 实体框架将一对多映射到一个中间表,而该表没有类,entity-framework,entity-framework-mapping,Entity Framework,Entity Framework Mapping,我有 问题 { //身份证等 公共列表文件{get;set;} } 由于CloudFile可以被其他类使用,最干净的解决方案似乎是创建一个名为IssueFile的中间表。问题是我在代码中没有使用这样的类。。。那么,我如何在Issue和CloudFile之间映射,而不创建这样的中间类呢。或者这可能吗?我知道也有类似的问题(),但它们创建了这个中间类,但希望是不必要的类。唯一无法从中间表中获得信息的是多对多映射。在您的情况下,您要处理的是多对可选或多对必需。现在您有两个选择: 1) 外键关联:为此

我有

问题
{
//身份证等
公共列表文件{get;set;}
}

由于
CloudFile
可以被其他类使用,最干净的解决方案似乎是创建一个名为
IssueFile
的中间表。问题是我在代码中没有使用这样的类。。。那么,我如何在
Issue
CloudFile
之间映射,而不创建这样的中间类呢。或者这可能吗?我知道也有类似的问题(),但它们创建了这个中间类,但希望是不必要的类。

唯一无法从中间表中获得信息的是多对多映射。在您的情况下,您要处理的是多对可选或多对必需。现在您有两个选择:

1) 外键关联:为此,您需要在
CloudFile
类中定义外键。这有一些优点,因为您可以通过更改外键值来更新关系,并且可以通过使用伪外键值来添加新实体,而不需要依赖实体。总的来说,它只是更容易使用

Issue
{
    //Id, etc
    public List<CloudFile> Files { get; set; }
}
modelBuilder.Entity()
.HasMany(i=>i.CloudFile)
.WithRequired(i=>i.Issue)
.HasForeignKey(i=>i.Id);
2) 独立关联:模型上没有外键(当然它在内部使用该键),并且该关系有自己的状态跟踪

modelBuilder.Entity<Issue>()
  .HasMany(i => i.CloudFile)
  .WithRequired(i => i.Issue)
  .HasForeignKey(i => i.Id);
modelBuilder.Entity()
.HasMany(i=>i.CloudFile)
.WithRequired(i=>i.Issue)
.Map(i=>i.MapKey(“Id”);

您需要的是每类型表(TPT)继承
CloudFile
将是您的基类,派生类型将表示与所属实体的关系(
Issue
Order
,等等):


为什么您认为1:N关系需要连接表?你的设计似乎有缺陷;也许您应该发布这些可以引用
CloudFile
s的“其他类”的示例,例如
User
可以拥有
CloudFile
s,一个
Order
可以拥有
CloudFile
s,我不希望
CloudFile
表拥有3个外键,其中2个总是
null
我觉得更干净的方法是为每一个设置一个中间表。问题是
CloudFile
表将获得一个
Issue\u Id
或任何外键。正如我所说,
CloudFile
将被
问题以外的其他事物使用。这意味着我的
CloudFile
表最终会有多个外键指向所有其他表。我不想那样。我想要一个将
CloudFile
映射到
Issue
的中间表,名为
IssueFile
。我的问题是,如何在
EF
中映射此设置,而不需要创建一个
IssueFile
类,我的代码中永远不需要这个类。我知道我需要这个表,但是我怎样才能避免需要这个类呢?为什么外键需要一个额外的表而不是一个额外的列呢?有了独立的关联,EF会在后台处理外键,这样您就不必处理它,甚至不会出现在您的模型中。一旦你有了一个连接表,你就要处理多对多的问题,没有办法解决。因为这让我的表很难看。它迫使我在大多数列中有许多空值。。。这只是一种糟糕的做事方式。我没有意识到多对多是不可能的。。。不是,这正是我需要的。谢谢
modelBuilder.Entity<Issue>()
  .HasMany(i => i.CloudFile)
  .WithRequired(i => i.Issue)
  .Map(i => i.MapKey("Id"));
[Table( "CloudFile" )]
public class CloudFile
{
    public int Id { get; set; }
}

[Table( "IssueCloudFile" )]
public class IssueCloudFile : CloudFile
{
}

public class Issue
{
    public int Id { get; set; }
    public List<IssueCloudFile> Files { get; set; }
}
modelBulider.Entity<CloudFile>().ToTable( "CloudFile" );
modelBuilder.Entity<IssueCloudFile>().ToTable( "IssueCloudFile" );
var issueCloudFiles = db.CloudFiles.OfType<IssueCloudFile>();
// or through the referencing entities themselves
issueCloudFiles = db.Issues.SelectMany( i => i.Files );