当前位置: 首页 > 知识库问答 >
问题:

在实体框架中设置多个外键作为主键

韦衡
2023-03-14

我正在使用实体框架管理我的sql server ce数据库。我希望我的表的主键由其他表的几个外键组成。我希望这样的事情能奏效:

class Bill{
    [Key]
    public virtual Customer Customer { get; set; }
    [Key]
    public virtual Era Era { get; set; }
    [Key]
    public virtual CompanyCode CompanyCode { get; set; }
    public long? Amount { get; set; }
}

但它会导致以下数据库迁移错误:

票据打印机。Bill::EntityType“Bill”没有定义键。定义此EntityType的键。Bills:EntityType:EntitySet“Bills”基于未定义键的类型“Bill”。

如何使表具有由这三个外键组成的主键?

共有1个答案

高山
2023-03-14

您不能将导航属性用作PKs。导航属性提供了一种在两种实体类型之间导航关联的方法,但它们本身并不表示关系的FK。您需要显式声明三个附加属性来表示关系的FK,如此模型所示:

public class Customer
{
  public int Id {get;set;}
  //...
}

public class Era 
{
  public int Id {get;set;}
  //...
}

public class CompanyCode 
{
  public int Id {get;set;}
  //...
}


public class Bill
{
  [Key] 
  [Column(Order=1)] 
  [ForeignKey("Customer")]
  public int CustomerId {get;set;}

  [Key] 
  [Column(Order=2)] 
  [ForeignKey("Era")]
  public int EraId {get;set;}


  [Key] 
  [Column(Order=3)] 
  [ForeignKey("CompanyCode")]
  public int CompanyCodeId {get;set;}
  //...
  public virtual Customer Customer { get; set; }
  public virtual Era Era { get; set; }
  public virtual CompanyCode CompanyCode { get; set; }
}

如您所见,当您有复合键时,实体框架要求您定义键属性的顺序。您可以使用注释来指定顺序。此外,您需要使用ForeignKey数据注释来明确您的意图,即哪个导航属性表示它是外键的关系。

 类似资料:
  • 在实体框架中,我想使用两个外键作为另一个实体类型的主键。 但是,这会给我一个缺少键的错误。 我知道我可以定义另外两个属性来保存引用实体类型的主键。Visual Studio是否不够聪明,无法自行使用它们的主键?

  • 我的MVC应用程序中有两个实体,我使用实体框架6代码优先的方法填充数据库。学生实体中有两个城市id;其中一个代表出生城市,另一个代表工作城市。当我如上所述定义外键时,将在迁移后在学生表中创建一个名为City\u ID的额外列。是否存在错误或如何定义这些FK?提前谢谢。 学生: 城市:

  • 我有一个ASP MVC.NET核心(C#)项目,由于业务原因,SQL表不能有外键,因此,EF模型不映射关系(Entity.HasMany...)。 假设EF为实体生成一个模型,为生成一个模型。我想知道他们两个之间的关系。一个有多个并且一个属于一个。该任务在数据库中有项目Id(但请记住,它没有设置为FK)。 现在,我想通过to Entity获得一个项目列表,同时获得每个项目的任务列表。我通过创建一个

  • 我想将类的外键从列表映射到类的主键。实体框架在子问题中没有建立这种关系。 我的形式类。 我的问题课。 IEntityTypeConfiguration中的配置应该是什么样子?

  • 我有一个MasterUserApprovalOfficial实体,它有两个外键,MasterUserId和SoftwareSystemId。EF 7足够聪明,可以看出这两个属性是外键。这是我的MasterUserApprovalOfficial类 如果我查看创建的表,MasterUserId列按预期创建并命名,SoftwareSystemId列然而被创建为(类的名称附加到主键的名称) 有什么原因吗

  • 如何使用hibernate注释实现下表? 当前代码为:(为简洁起见,已删除) 使用者 社交网络 SocialProfile公司 显然我的代码现在不能正常工作。有人能解释一下吗?