我似乎无法正确理解 Foo和Bar之间的关系。
public class Foo
{
[Key]
public int Id { get; set; }
public int Name { get; set; }
public virtual Bar Bar { get; set; }
}
public class Bar
{
[Key]
public int Id { get; set; }
public int Name { get; set; }
public int FooId { get; set; }
public virtual Foo Foo { get; set; }
}
有了这个结构,我通常会有
public virtual ICollection<Bar> Bars { get; set; }
在 Foo 中,但在这种情况下,这不是我的数据的可行表示。
你看....
Foo并不总是有一个Bar ...但是... Bar总是有一个Foo并且它的 FooId 在Bar中总是唯一的。
public class MyContext : DbContext
{
public DbSet<Foo> Foos { get; set; }
public DbSet<Bar> Bars { get; set; }
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// ...............
modelBuilder.Entity<Foo>()
.HasOptional(cpi => cpi.Bar)
.WithRequired(api => api.Foo);
// ...............
}
}
我已经尝试过多次尝试定义这种关系,但似乎无法做到正确!如果这将使我能够做我想做的事(但我不希望这样做),我也可以向 Foo 添加一个可为空的 BarId。(见编辑1)
我已经用谷歌搜索了很多(并搜索并尝试了),许多类似(但不相同)的堆栈溢出帖子。
任何输入将不胜感激。
谢谢
编辑1(回应消费者评论):
这些表已经存在于许多实时环境中并且充满了数据,所以我想在不编辑 db 表定义的情况下找到一个解决方案......但如果这不可能,我可以添加一个列来实现我需要的。
以前我把它定义为...
public virtual ICollection<Bar> Bars { get; set; }
...但这不适用于我使用这些表编写的一段代码。
编辑2:
当我尝试添加 Bar 时,上面的代码给出了以下错误。
“当 IDENTITY_INSERT 设置为 OFF 时,无法为表 'Bar' 中的标识列插入显式值。”
身份插入未关闭,我将它用于所有表,除非在这种情况下,EF 似乎根据我对这些表的定义将其关闭。