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

时间:2016-01-21 03:27:46

标签: entity-framework entity-framework-mapping

我有

<Stepper Minimum="0" Maximum="10" Increment="0.1" ValueChanged="OnStepperValueChanged" />

    <Label Text="{Binding Amount}" />

并且由于public class theInfo { public string Amount { get; set; } } myList.Add (new theInfo () {Amount = "0" }); //i add this in my listviewcode. it works, I get 0 in my listview on every created row. async void OnStepperValueChanged(object sender, ValueChangedEventArgs e) { new theInfo () {Amount = string.Format ("Stepper value is {0:F1}", e.NewValue) }; //I reckon I have to convert Amount to a label.text somehow? } 可以被其他类使用,因此最干净的解决方案似乎创建了一个名为Issue { //Id, etc public List<CloudFile> Files { get; set; } } 的中间表。问题是我在我的代码中没有使用这样的类...所以如何在不创建这样的中间类的情况下在CloudFileIssueFile之间进行映射。或者这甚至可能吗?我知道有类似的问题(One to Many mapping with an intermediate table),但他们创建了这个中级但希望是不必要的课程。

2 个答案:

答案 0 :(得分: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"));

答案 1 :(得分:1)

你想要的是每个类型的表(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" );

如果仅DbSet<CloudFile>使用DbSet来导出CloudFile的派生类型,请使用.OfType<T>()来获取这些类型:

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