没有外键常量的实体框架关系

时间:2017-05-26 14:46:06

标签: entity-framework ef-fluent-api

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

举一个我的问题的例子:

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

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

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

编辑:忘记提及使用Fluent API

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

我将公共虚拟A a {get; set}添加到B<实体模型中。

然后从那里到实体配置,我尝试了几个不同的东西,如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");
    }

2 个答案:

答案 0 :(得分:1)

如果您在使用导航属性的流畅映射时遇到问题,请尝试创建 具有外键的示例数据库,并从中生成代码优先模型。那应该会告诉你正确的配置。

答案 1 :(得分:0)

对我有用的是:

在 A:

public int ID { get; set; }

在 B:

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 添加丢失的外键,因为当您像这样伪造错误数据时,它们可能会搞砸您的整个查询。