【问题标题】:Defining Foreign keys in Entity Framework在实体框架中定义外键
【发布时间】:2015-07-10 21:43:28
【问题描述】:

我收到一个间歇性错误

保存不为其关系公开外键属性的实体时出错

我相信这可能是因为我没有在我的实体框架数据库层中正确定义我的关系。

我已经定义了一个具有 1:1 关系的表:

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }


    public FinalisedServices Service { get; set; }

其中 SpproFinalisedServices 是外键。我应该这样写吗:

     public int FinalisedSerivce_Id { get; set; }

    [ForeignKey("FinalisedSerivce_Id")]
    public FinalisedServices Service { get; set; }

或者添加虚拟就足够了:

    public virtual FinalisedServices Service { get; set; }

我最初认为实体框架会在后台处理数据库外键。

【问题讨论】:

  • 你看过内部异常了吗?这(通常)准确地显示了 EF 存在问题的实体和关系。这应该有助于诊断问题。
  • 问题只发生在实时系统上。我也需要标记内部异常,但希望在它再次发生之前解决它

标签: c# asp.net-mvc entity-framework


【解决方案1】:
public virtual ICollection<FinalisedQuoteStaff> JobManagers { get; set; }

public virtual ICollection<FinalisedQuoteStaff> AllocatedStaff { get; set; }

这并没有定义一对一的关系。任何时候你包含一个集合,你都在定义一个一对多或多对多。根据您的其他代码,我假设您要进行一对多。 IE。多个经理和员工在一项服务上。请检查此tutorial。您不需要在最终服务上明确定义外键。这适用于有多个外键和/或外键名称与外键表不同的情况。

您也不需要[DatabaseGenerated(DatabaseGeneratedOption.Identity)] - 这是约定优于配置 - 默认情况下会这样做。如果您将 Id 字段命名为奇怪的东西,您将需要它。当您将其命名为“Id”时,它是自动的。

【讨论】:

  • 抱歉,我不应该包含多对多关系。它们与问题无关,但我想答案是它们不是必需的,不是我的问题
  • 您需要发布整个表格。如果某些东西是专有的,请更改名称,只要确保它们是一致的 - 像“s”这样的小东西,在这里你命名事物的方式很重要,我相信你知道。
  • @michael: 作为一个例子 public FinalisedServices Service { get;放; } - 这需要是“FinalizedService”,而不是复数。假设您有一项服务。否则它需要是一个服务集合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多