复合键问题

时间:2014-06-17 12:52:28

标签: c# entity-framework entity-relationship fluent ef-database-first

我需要一些帮助。我有两个解决方案,需要给出相同的结果。其中一个工作正常,但另一个工作正常。

public class Calculation
 {
  public int ClacID { get; set; }
  public string CalcNumber { get; set; }
  public string BillNumber { get; set; }
  public DateTime BillDate { get; set; }
  public DateTime CreateDate { get; set; }
  public DateTime ModifiedDate { get; set; }
  public bool IsDeleted { get; set; }

  public Company Company { get; set; }
  public int SupplierID { get; set; }
  public int CompanyID { get; set; }
}

public class Company
{
    public int CompanyID { get; set; }
    public int? RegistrationNumber { get; set; }
    public string CompanyName { get; set; }
    public CompanyRegister CompanyRegister { get; set; }
    public string OwnerFirstname { get; set; }
    public string OwnerLastname { get; set; }
    public string Address { get; set; }
    public Place Place { get; set; }
    public string Telefon { get; set; }
    public string Telefax { get; set; }
    public string Mobile { get; set; }
    public string Email { get; set; }
    public int? CompanyType { get; set; }

    public int? UserId { get; set; }
    public Users User { get; set; }

    //References
    public List<Calculation> CalculationList { get; set; }

    public Company()
    {
        Place = new Place();
        CompanyRegister = new CompanyRegister();
        CalculationList = new List<Calculation>();
    }

}

配置:

public class CalculationConfiguration : EntityTypeConfiguration<Calculation>
    {
        public CalculationConfiguration()
        {
            // Set Table
            ToTable("Calculation");

            // Primary
            HasKey(p => p.ClacID);

            //Foreign Keys
            HasRequired<Company>(c => c.Company)
                .WithMany(c => c.CalculationList)
                .HasForeignKey(d => new { d.CompanyID, d.SupplierID });

            //HasRequired<Company>(c => c.Company).WithMany(c => c.CalculationList).HasForeignKey(c => c.CompanyID);
            //HasRequired<Company>(c => c.Company).WithMany(c => c.CalculationList).HasForeignKey(c => c.SupplierID);

            //Map
            Property(p => p.ClacID).HasColumnName("CalcID");
            Property(p => p.CompanyID).HasColumnName("CompanyID");
            Property(p => p.CalcNumber).HasColumnName("CalcNumber").HasMaxLength(10);
            Property(p => p.SupplierID).HasColumnName("SupplierID");
            Property(p => p.BillNumber).HasColumnName("BillNumber").HasMaxLength(100);
            Property(p => p.BillDate).HasColumnName("BillDate");
            Property(p => p.CreateDate).HasColumnName("CreateDate");
            Property(p => p.ModifiedDate).HasColumnName("ModifiedDate");
            Property(p => p.IsDeleted).HasColumnName("IsDeleted");
        }
    }

不要工作:

        //Foreign Keys
        HasRequired<Company>(c => c.Company)
            .WithMany(c => c.CalculationList)
            .HasForeignKey(d => new { d.CompanyID, d.SupplierID });

工作:

HasRequired<Company>(c => c.Company).WithMany(c => c.CalculationList).HasForeignKey(c => c.CompanyID);
HasRequired<Company>(c => c.Company).WithMany(c => c.CalculationList).HasForeignKey(c => c.SupplierID);

世上有人能告诉我。怎么了?

感谢。 Zlaja

2 个答案:

答案 0 :(得分:1)

尝试以下代码: -

 //Foreign Keys
        HasRequired<Company>(c => c.Company)
            .WithMany(c => c.CalculationList)
            .HasForeignKey(d => new Company { d.CompanyID, d.SupplierID });

答案 1 :(得分:0)

EF(最多6.1)仅接受设置主实体中的PK与依赖实体中的FK之间的关系。

您不能将FK指定为Company,因为它取决于CompanyId以外的内容,而Company的PK就是。

您既不能基于AK设置关系。但是在您的示例代码中,它甚至不是AK(备用键=具有唯一约束的列集=候选键)。

为什么不将这种关系仅设置为PK CompanyId?使用与PK或AK不同的东西毫无意义。

顺便说一句,如果它真的是AK,而你想要这个功能,请转到EF user's voice site,然后投票给它(它通常是最需要的功能)