[英]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.