【发布时间】:2018-01-18 08:28:36
【问题描述】:
我们需要定义以下实体之间的一对一关系:
public class Foo
{
[Key, Column("Foo_ID")]
public int Id { get; set; }
public Bar Bar { get; set; }
}
public class Bar
{
[Key, Column("Bar_ID")]
public int Id { get; set; }
[Column("Bar_Foo_ID")]
public int? FooId { get; set; }
public Foo Foo { get; set; }
}
我们需要迁移旧版软件,并暂时让它们同时运行。所以我们不能改变任何关系。不幸的是,数据库中没有定义外键。
modelBuilder.Entity<Foo>()
.HasOptional(a => a.Bar)
.WithRequired(x => x.Foo)
.WillCascadeOnDelete(true);
当我们查询 Foo 和 Include(x => x.Bar) 时,它会创建一个带有 LEFT OUTER JOIN bars ON Foo_ID = Bar_ID 的 SQL 查询,这是错误的。
我们需要将其更改为LEFT OUTER JOIN bars on Foo_ID = Bar_Foo_ID,但我不确定实体框架如何支持它,因为我们的数据库中没有外键,Bar_ID 作为 PrimaryKey。
我知道一个Foo 可能有多个Bars,但是有没有办法强制一对一的关系?
创建Foo 时,始终会为其创建Bar。
【问题讨论】:
-
一对一关系(甚至任何关系)没有外键?!我不知道是否可以这样做。但是您可以阅读此内容,可能会对entityframeworktutorial.net/code-first/… 有所帮助还有另一件事,如果
Bar总是为Foo创建的,为什么还要LEFT JOIN?! -
已经去过那里,但不幸的是这不起作用。我从 SQL Profiler 获得了
LEFT OUTER JOIN。该查询由 LINQ2Entities 生成。 -
如果您想要精确的一对一关系(不是一对零或一),请阅读此stackoverflow.com/questions/10292355/…
-
好吧,我错了,我想要实现的是一对零或一的关系,它“事实上”从不为零,因为我们的代码确保在创建记录时创建父实体。
-
@grek40 似乎有一个合理的解决方法,但如果这不合适,您始终可以考虑 not 映射导航属性并使用
join或Join手动加入在你自己的记录。除此之外,我模糊地记得HasOne在这里很有用。
标签: c# .net entity-framework