MVC实体框架 - 来自一个字段中多个表的外键

时间:2017-08-29 00:15:19

标签: c# entity-framework firebird ef-fluent-api

所以我正在构建一个现有程序的接口,它建立在一个firebird数据库之上。我已经使用firebird的数据提供程序生成了一些模型,我正在尝试定义几个具有奇怪结构的表之间的关系,我不能在不破坏程序的情况下进行更改。

这是目前的结构归结为:

public partial class JOBLINE
{
    [Key, Column(Order = 0)]
    public int JobNumber {get;set;}
    [Key, Column(Order = 1)]
    public int LineNumber {get;set;}
    public string LineType {get;set;} // can be either 'Item Code' or 'Descriptor Code'
    public string LineCode {get;set;}
}

public partial class ITEMMASTER
{
    [Key]
    public string ItemCode {get;set;}
    // The other properties
}

public partial class DESCRIPTORMASTER
{
    [Key]
    public string DescriptorCode {get;set;}
    // The other properties
}

令人讨厌的是,在jobline表中,LineCode字段可以包含ItemMasterDescriptorMaster的外键,具体取决于CodeType 1}}字段包含。

有一种简单的方法可以指定吗?使用流畅的API或数据注释。我希望有ItemMasterDescriptorMaster

的列表访问器

1 个答案:

答案 0 :(得分:1)

  

令人烦恼的是,在作业表中,LineCode字段   可以包含ItemMaster的外键,或   DescriptorMaster,取决于CodeType字段包含的内容。

你确定你的数据库(Firebird)允许这样的事情吗?

使用关系概念的数据库不允许外键列包含来自不同表的值。外键是在这两个表之间建立关系而不是更多。

在您的情况下,您唯一能做的就是创建一个唯一的约束,将这两列组合在一起:LineTypeLineCode

因此,您可以使用Index数据注释属性,如下所示:

public partial class JOBLINE
{
    [Key, Column(Order = 0)]
    public int JobNumber {get;set;}
    [Key, Column(Order = 1)]
    public int LineNumber {get;set;}

    [Index("IX_LineTypeAndLineCode", 1, IsUnique = true)]
    public string LineType {get;set;} 

    [Index("IX_LineTypeAndLineCode", 2, IsUnique = true)]
    public string LineCode {get;set;}
}

或使用如下所示的流畅配置:

modelBuilder.Entity<JOBLINE>()
    .Property(p => p.LineType)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("IX_LineTypeAndLineCode") { IsUnique = true, Order = 1 }));

modelBuilder.Entity<JOBLINE>()
    .Property(p => p.LineCode)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("IX_LineTypeAndLineCode") { IsUnique = true, Order = 2 }));

使用唯一约束,您可以确保LineType表中每个JOBLINE值的foreach都有LineCode的唯一值。