(注意 - 我无法控制数据库及其表格。)
举一个我的问题的例子:
表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");
}
答案 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 添加丢失的外键,因为当您像这样伪造错误数据时,它们可能会搞砸您的整个查询。