我正在尝试设置两个实体Fund
和RedemptionFee
之间的可选:必需关系。基金可能有也可能没有赎回费,但赎回费需要基金。该模型基本上是这个(省略了非相关属性)
public class Fund
{
public int FundId {get; set;}
public string FundCode {get; set;}
public virtual RedemptionFee RedemptionFee {get; set;}
}
public class RedemptionFee
{
public string FundCode {get; set;}
public virtual Fund Fund {get; set;}
}
我认为问题在于Fund
对象上FundId
是我的主键,需要保持这种状态,因为大约有6或7个其他实体{{ 1}}与Fund
相关。在FundId
上,RedemptionFee
是主键。 FundCode
也是FundCode
对象的一部分,但不是主键。
当我尝试配置这样的关系时(在基金的Fund
对象中)
EntityTypeConfiguration
生成的SQL尝试将基金表与每个主键加入HasOptional(f=>f.RedemptionFee).WithRequired(f=>f.Fund);
表,这显然不起作用。我需要指定生成的SQL通过RedemptionFee
加入两个表。
有办法做到这一点吗?它是非常基本的SQL,但它似乎在EF中是不可能的,除非我遗漏了一些东西.EF似乎要求依赖的外键与定义关系时主键上的主键相同,我想基本上选择一个用于定义该关系的任意列。
答案 0 :(得分:0)
在一对一关系中,存在主体和从属实体。在依赖实体中,您声明FK属性,该属性也是该实体的PK,因此它将与您的主体的PK匹配。
我建议您解决问题的方法是在您的基金实体中使用FundCode
作为PK:
public class Fund
{
[Key]
public string FundCode {get; set;}
public virtual RedemptionFee RedemptionFee {get; set;}
}
public class RedemptionFee
{
[Key]
[ForeignKey("Fund")]
public string FundCode {get; set;}
public virtual Fund Fund {get; set;}
}
现在,你说你无法改变你的模型,你可以创建两个关系来实现你需要的模型:
modelBuilder.Entity<Fund>().HasOptional(f=>f.RedemptionFee).WithMany().HasForeignKey(f=>f.FundCode);
modelBuilder.Entity<RedemptionFee>().HasRequired(f=>f.RedemptionFee).WithMany();
但当然,使用这些配置,您的实体不会直接相关。