所以我正在构建一个现有程序的接口,它建立在一个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
字段可以包含ItemMaster
或DescriptorMaster
的外键,具体取决于CodeType
1}}字段包含。
有一种简单的方法可以指定吗?使用流畅的API或数据注释。我希望有ItemMaster
和DescriptorMaster
表
答案 0 :(得分:1)
令人烦恼的是,在作业表中,LineCode字段 可以包含ItemMaster的外键,或 DescriptorMaster,取决于CodeType字段包含的内容。
你确定你的数据库(Firebird)允许这样的事情吗?
使用关系概念的数据库不允许外键列包含来自不同表的值。外键是在这两个表之间建立关系而不是更多。
在您的情况下,您唯一能做的就是创建一个唯一的约束,将这两列组合在一起:LineType
和LineCode
。
因此,您可以使用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
的唯一值。