1

我似乎无法正确理解 FooBar之间的关系。

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 似乎根据我对这些表的定义将其关闭。

4

3 回答 3

0

所以你真正的问题是

当 IDENTITY_INSERT 设置为 OFF 时,无法在表“Bar”中插入标识列的显式值

首先,此错误消息意味着:当当前配置为不允许该操作 (off) 时,您正在尝试将值插入标识列

实体框架可能试图插入零,因为您没有告诉 EF 身份列;这意味着您需要明确告诉 EF 您的此列正在从数据库中生成您的 Id...

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Foo>()
                .HasOptional(cpi => cpi.Bar)
                .WithRequired(api => api.Foo);

    // needed
    modelBuilder.Entity<Bar>()
      .HasKey(b => b.Id)
      .Property(b => b.Id)
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
于 2016-09-22T15:48:16.043 回答
0

我们可以试试DataAnnotations吗?

public class Foo
{
    public int Id { get; set; }

    public string  Name { get; set; }

    public virtual Bar Bar { get; set; }
}


public class Bar
{

    [Key, ForeignKey("Foo")]
    public override int Id {get;set;}

    public string Name { get; set; }

    public virtual Foo Foo { get; set; }
}
于 2016-09-22T15:50:21.417 回答
0

对象是可以为空的,所以关系是可选的,不需要你做任何与你的.HasOptional()声明不同的事情。

但是,您的关系缺少外键。

public class Foo
{
    [Key]
    public int Id { get; set; }

    public int Name { get; set; }

    public int BarId { get; set; } // Add this!

    [ForeignKey(nameof(BarId))] // Add this!
    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; }

    [ForeignKey(nameof(FooId))] // Add this!
    public virtual Foo Foo { get; set; }
}
于 2016-09-22T16:02:25.167 回答