实体框架使用中间表映射一对多,中间表没有该表的类



我有

Issue
{
    //Id, etc
    public List<CloudFile> Files { get; set; }
}

由于CloudFile可以被其他类使用,因此最干净的解决方案似乎是创建一个名为 IssueFile 的中间表。问题是我在我的代码中没有这样的类......那么如何在不创建这样一个中间类的情况下在 IssueCloudFile 之间进行映射。或者这甚至可能吗?我知道有类似的问题(带有中间表的一对多映射),但它们创建了这个中间但希望是不必要的类。

你想要

的是按类型表(TPT)继承。 CloudFile将是你的基类,派生类型将表示与拥有实体的关系(IssueOrder等):

[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; }
}

或通过 Fluent API:

modelBulider.Entity<CloudFile>().ToTable( "CloudFile" );
modelBuilder.Entity<IssueCloudFile>().ToTable( "IssueCloudFile" );

如果仅对派生类型的CloudFile使用 DbSet<CloudFile>而不使用 DbSet s,请使用 .OfType<T>() 仅获取这些类型:

var issueCloudFiles = db.CloudFiles.OfType<IssueCloudFile>();
// or through the referencing entities themselves
issueCloudFiles = db.Issues.SelectMany( i => i.Files );

唯一无法退出中间表的情况是多对多映射。在您的情况下,您正在处理多对可选或多对需要。现在您有两个选择:

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

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

2)独立关联:模型上没有外键(当然,它在内部使用键),并且关系跟踪了自己的状态。

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

最新更新