实体框架 - 配置可选:使用不同的外键

时间:2016-06-17 20:08:00

标签: c# .net entity-framework entity-framework-6

我正在尝试设置两个实体FundRedemptionFee之间的可选:必需关系。基金可能有也可能没有赎回费,但赎回费需要基金。该模型基本上是这个(省略了非相关属性)

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似乎要求依赖的外键与定义关系时主键上的主键相同,我想基本上选择一个用于定义该关系的任意列。

1 个答案:

答案 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();

但当然,使用这些配置,您的实体不会直接相关。