1

我有

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

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

4

2 回答 2

1

唯一没有离开中间表的情况是多对多映射。在您的情况下,您正在处理多对可选或多对必需。现在你有两个选择:

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"));
于 2016-01-21T08:11:24.477 回答
1

您想要的是 Table-per-Type (TPT) 继承。 CloudFile将是您的基类,派生类型将表示与拥有实体(、、等)的Issue关系Order

[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" );

如果您DbSet<CloudFile>只使用不带DbSets 的派生类型CloudFile,请使用.OfType<T>()仅获取这些类型:

var issueCloudFiles = db.CloudFiles.OfType<IssueCloudFile>();
// or through the referencing entities themselves
issueCloudFiles = db.Issues.SelectMany( i => i.Files );
于 2016-01-21T18:59:26.373 回答