【问题标题】:EF 6 Code First one column is not createdEF 6 Code First 一列未创建
【发布时间】:2014-07-30 13:50:13
【问题描述】:

我使用的是 EF 6 Code First,我不明白为什么没有为我的模型的属性创建一列。

这是第一堂课:

    public class Original
    {
    public int ID { get; set; }
    public string Nom { get; private set; }
    public Historique Historique { get; private set; }
    public Traduction Traduction { get; private set; }
    }

这是第二课:

   public class Traduction
   { 
    public int ID { get; set; }
    public Utilisateur Traducteur { get; private set; }
    public Original Original { get; private set; }
    public string Content { get; private set; }
   }

EF 不会为 Traduction 和 Original 创建 FK 列。 (Traduction 表不包含 Original 的 FK 列,反之亦然)但它完美地创建了所有其他列和 FK。

我正在使用 Fluent API 来建立关系。我已经尝试过依赖自动约定,并明确配置关系:

   modelBuilder.Entity<Original>().HasRequired(o => o.Traduction).WithRequiredPrincipal(t=>t.Original).WillCascadeOnDelete(true);

但仍未创建列。

感谢您的帮助

更新

我不知道它是否有用但我想添加一个信息,我的 Dbset 在上下文类中是这样定义的:

public DbSet<Traduction> Traductions { get; set; }
public DbSet<Original> Originaux { get; set; }

“Originaux”如果是“Originals”的法语复数。但是我注意到 EF 创建的表被命名为“Originals”,并且不遵循 DbSet 的名称。我不知道,也许这可能是问题的原因。

【问题讨论】:

  • ID 应该是外键列,因为您定义了 1:1 关系。此外,EF 不会根据您所称的 DbSet 来命名您的表。它根据实体类型名称的复数来命名。原件 = 原件
  • 感谢您的帮助@Dismissile,那我应该添加什么?
  • 您不需要添加任何内容。如果您查看数据库中的 ID,它应该是一个表中的主键和外键。它将只是另一个表中的主键。这就是一对一关系在数据库中的工作方式。
  • 谢谢!不幸的是,我无权访问 SQL Server MS,并且由于我使用的是 VS2010,因此我无法访问表定义,因为它托管在 MS Server 2012 上。但是 EF 将如何构造(例如)我的原始对象,如果它没有将相应 Traduction 的 ID 存储在列中?我问这个问题是因为我注意到当我从数据库中检索对象时 Traduction 属性为空。在看到数据库中没有 Traduction_ID 列后,我得出结论认为这是问题的原因。
  • 哦还有,Original 和 Historique 也有 1:1 的关系,而且 DB 中有 Historique_ID 列!

标签: c# entity-framework ef-code-first ef-fluent-api


【解决方案1】:

正如 Dismissile 所说,EF 不会创建额外的列来保存外键,因为它是一对一的关系。这是正常行为,实际上并没有什么问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多