【问题标题】:Entity Framework relationship without foreign key constrant没有外键约束的实体框架关系
【发布时间】:2017-10-27 12:23:36
【问题描述】:

(注意 - 我无法控制数据库及其表)。

举一个我的问题的例子:

表 A 上有 ID (PK) 和 CreateDate 表 B 上有 ID (PK) 和 A_ID

A_ID 不是外键,但表 B 需要从表 A 中获取 create_date。如何在实体框架中执行此操作?

不确定这是否相关,但 A 可以有 0 个或许多 B 和 B 只能有一个 A

编辑:忘记提及使用 Fluent API

编辑 2:我已经尝试映射这两个表。

我在 B 的实体模型上添加了公共虚拟 A {get;set}。

然后从那里,到实体配置,我尝试了一些不同的东西,例如 HasRequired(x => xA).WithOptional() 和 HasRequired(x => xA).WithMany().HasForeignKey(x => x.A_ID) (尽管有很多错误,但这是我看到如何指定外键的唯一方法,也知道没有外键)。我还添加了 HasKey(x => x.A_ID) 但这对我来说似乎并不正确。

基本上,我尝试了所有类型的 Has 和 With。我对实体框架流利的 api 仍然很陌生,但我搜索了互联网并发现了类似的问题,但还不够相似,无法帮助我找到答案。大多数情况下,我找到了“不可能”类型的答案。

在进行连接方面,如果我弄错了,请纠正我,这不是流利的 api,它没有将表相互映射对吗?我只是在我的方法中加入表格?

编辑 3:迄今为止的实体模型和实体配置,删除了不必要的内容并更改了事物的名称(但其他方面完全准确)

public class A
{
    /// <summary>
    ///     ID
    /// </summary>
    public virtual int ID { get; set; }

    /// <summary>
    ///     Relationship to B
    /// </summary>
    public virtual B b { get; set; }
}

public class B
{
    /// <summary>
    ///     ID of B
    /// </summary>
    public virtual int ID { get; set; }

    /// <summary>
    ///     Name of B
    /// </summary>
    public virtual string Name { get; set; }

    /// <summary>
    ///     DateTime B is created
    /// </summary>
    public virtual DateTime? DateTime { get; set; }
}

    public AConfiguration()
    {
        Property(x => x.ID).HasColumnName("a_id");
        Property(x => x.B_ID).HasColumnName("b_id");

        HasKey(x => x.ID);

        ToTable("a", "safe");
    }

    public BConfiguration()
    {
        Property(x => x.ID).HasColumnName("b_id");
        Property(x => x.DateTime).HasColumnName("b_datetime");
        HasKey(x => x.ID);

        ToTable("b", "safe");
    }

【问题讨论】:

  • 所以你想要一个约束,但不在数据库上?
  • 我认为答案是肯定的。我想将 a_id 视为外键,即使数据库没有(它应该是,但由于某种原因它不是这样设置的)。
  • 你有没有尝试过?如果没有,你应该。如果是,您应该告诉我们哪些地方没有按预期工作。
  • 为什么不能使用简单的连接?
  • 或 lambda 函数,这是最简单的事情,你还没有表现出任何努力:db.tableB.FirstOrDefault( t =&gt; t.id_a == id_your_checking_from_tableA); 所以开始编码并返回卷轴问题

标签: entity-framework ef-fluent-api


【解决方案1】:

如果您在导航属性的流畅映射方面遇到问题,请尝试创建一个确实具有外键的示例数据库,并从中生成代码优先模型。这应该会显示正确的配置。

【讨论】:

    【解决方案2】:

    对我有用的是:

    在答:

    public int ID { get; set; }
    

    在乙:

    public int A_ID { get; set; }
    public virtual A A { get; set; }
    

    在 B 的实体构建器中:

    builder
      .HasOne(b => b.A)
      .HasMany()
      .HasForeignKey(b => b.A_ID)
      // I'm assuming you already have A's primary key set up.
      // If not, add .HasPrincipalKey(a => a.ID)
    

    强烈建议唠叨 DBA 添加缺少的外键,因为当你像这样伪造它们时,错误的数据可能会搞砸你的整个查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 2017-07-20
      相关资源
      最近更新 更多