繁体   English   中英

实体框架6.1.2中的外键

[英]Foreign Keys in Entity Framework 6.1.2

在过去的几天/几周里,我一直试图找到我的方式。 目前我在处理外键方面有点困难,在这种情况下,我有一个表有两个FK自己(请不要问我的数据库设计,因为这只是我面临的情况,没有机会改变数据库结构)。

我已将代码缩减到下面的示例,其中我使用了类Foo描述的单个表:

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

    public string Data { get; set; }

    public int firstFkID { get; set; }

    public int secondFkID { get; set; }

    [ForeignKey("firstFkID")]
    public virtual Foo firstFk { get; set; }

    [ForeignKey("secondFkID")]
    public virtual Foo secondFk { get; set; }
}

我的DbContext派生类:

class EFFKContext : DbContext
{
    public EFFKContext(string connectionString) : base(connectionString) { }

    public virtual DbSet<Foo> Foo { get; set; }
}

当然,我使用这一切的代码:

static void Main(string[] args)
{
    SqlConnectionStringBuilder cnStrBuilder = new SqlConnectionStringBuilder()
    {
        DataSource = "(local)",
        InitialCatalog = "EF_FK",
        IntegratedSecurity = true
    };

    EFFKContext context = new EFFKContext(cnStrBuilder.ConnectionString);

    Foo foo = context.Foo.Find(3);

    Foo fFoo = foo.firstFk;

    Foo sFoo = foo.secondFk;
}

当我编译它时,根本没有问题,但在运行时我得到以下错误:

> EntityFramework.dll中出现未处理的“System.InvalidOperationException”类型异常

附加信息:无法确定类型'RF_EF_FK.Foo'和'RF_EF_FK.Foo'之间关联的主要结束。 必须使用关系fluent> API或数据注释显式配置this>关联的主要结尾

任何人都可以解释为什么我会收到这个错误,它究竟意味着什么,并指出我必须修改我的代码以使其按照我想要的方式运行的方向?

哪个能够获得两个FK指向的对象。

我尝试过以下方法:

  • 添加其他导航属性以返回集合,但这不提供所需的解决方案。 这种关系也不是一对多的关系,所以这甚至都不正确。

  • 我也尝试添加一些Fluent API代码,但这再次没有为我提供我需要的解决方案。

虽然我已经尝试过以上的事情,但我很可能错过了那里的任何事情。 任何帮助都非常欢迎!


编辑:

在继续我的搜索以解决这个问题的同时,我发现在我的上下文类中添加以下内容可以解决FK问题。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{          
    modelBuilder.Entity<Foo>().HasOptional(f => f.secondFk).WithMany().HasForeignKey(f => f.secondFkID);
    modelBuilder.Entity<Foo>().HasOptional(f => f.firstFk).WithMany().HasForeignKey(f => f.firstFkID);
}

现在,当从数据库加载实体时,我需要使用Include函数立即包含相关对象,或者稍后使用以下内容加载它:

context.Entry(sFoo).Reference("firstFk").Load();

仍然不确定这是否是可行的方式。

由于没有提交Jenish Radadiya的其他答案,我现在将自己的发现作为答案发布。

在继续我的搜索以解决这个问题的同时,我发现在我的上下文类中添加以下内容可以解决FK问题。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{          
    modelBuilder.Entity<Foo>().HasOptional(f => f.secondFk).WithMany().HasForeignKey(f => f.secondFkID);
    modelBuilder.Entity<Foo>().HasOptional(f => f.firstFk).WithMany().HasForeignKey(f => f.firstFkID);
}

现在,当从数据库加载实体时,我需要使用Include函数立即包含相关对象,或者稍后使用以下内容加载它:

context.Entry(sFoo).Reference("firstFk").Load();

仍然不确定这是否是可行的方式。

您可能需要将一个字段设为可为空。 我对此不太确定。

您可以使用Fluent api来准备模型关系。

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

    public string Data { get; set; }

    public int firstFkID { get; set; }

    public int secondFkID { get; set; }

    //[ForeignKey("firstFkID")] <- remove this while using fluent api
    public virtual Foo firstFk { get; set; }

    //[ForeignKey("secondFkID")] <- remove this while using fluent api
    public virtual Foo secondFk { get; set; }
}

试试这个。

public class FooConfiguration : EntityTypeConfiguration<Foo>
{
    public FooConfiguration()
    {
        this.HasKey(x => x.ID);

        this.HasOptional(f => f.firstFk)
            .WithOptionalDependent(f => f.secondFk);
    }
}

我还发现一个相关计算器线程=> 点击这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM