FK 相同 Table 代码优先 Entity Framework
FK to the Same Table Code First Entity Framework
我是 Entity Framework 中代码优先方法的新手。我对如何做到这一点感到有点困惑:
我需要与相同的 FK 关系 table,这样我就可以在元素之间建立父 --> 子关系。
这是Table的型号:
public class BucketGroup
{
public int Id {get;set;} // This is the PK in the Table
public string Name {get;set;}
// Now this the FK, to this Same Table:
public int? BucketGroupId {get;set;}
}
所以我将这个项目设置为 Nullable,如果 BucketGroupId
是 NULL 那么我知道它是一个父项目。
我创建了一个测试项目并使用数据库优先,模型是这样的:
public partial class Testing
{
public Testing()
{
this.Testing1 = new HashSet<Testing>();
}
public int Id { get; set; }
public Nullable<int> ParentId { get; set; }
public virtual ICollection<Testing> Testing1 { get; set; }
public virtual Testing Testing2 { get; set; }
}
因此,如果我向我的模型添加一个类似的 属性 是否会使它成为 PK
ID 的 FK
?
public class BucketGroup
{
public int Id {get;set;} // This is the PK in the Table
public string Name {get;set;}
// Now this the FK, to this Same Table:
public int? BucketGroupId {get;set;}
public virtual ICollection<BucketGroup> BucketGroup1 { get; set; }
}
这是正确的吗?
您有两种选择:
-
public class BucketGroup
{
public int Id {get;set;}
public string Name {get;set;}
[ForeignKey("ParentBucketGroup")]
public int? ParentBucketGroupId {get;set;}
public virtual BucketGroup ParentBucketGroup {get;set;}
public virtual ICollection<BucketGroup> Children { get; set; }
}
或者,使用 Fluent Api:
public class BucketGroup
{
public int Id {get;set;}
public string Name {get;set;}
public int? ParentBucketGroupId {get;set;}
public virtual BucketGroup ParentBucketGroup {get;set;}
public virtual ICollection<BucketGroup> Children { get; set; }
}
并且,要配置关系,您可以在上下文中覆盖 OnModelCreating
方法:
modelbuilder.Entity<BucketGroup>().HasOptional(b=>b.ParentBucketGroup )
.WithMany(b=>b.Children )
.HasForeignKey(b=>b.ParentBucketGroupId);
更新
如果需要,您可以使用单向(也称为单向)关系,但您需要保留其中之一。
如果您删除 Children
导航 属性,那么,您的配置将是这样的:
modelbuilder.Entity<BucketGroup>().HasOptional(b=>b.ParentBucketGroup)
.WithMany()
.HasForeignKey(b=>b.ParentBucketGroupId);
或者,如果您删除 ParentBuketGroup
导航。 属性,那么你需要这样做:
modelbuilder.Entity<BucketGroup>().HasOptional()
.WithMany(b=>b.Children)
.HasForeignKey(b=>b.ParentBucketGroupId);
我是 Entity Framework 中代码优先方法的新手。我对如何做到这一点感到有点困惑:
我需要与相同的 FK 关系 table,这样我就可以在元素之间建立父 --> 子关系。
这是Table的型号:
public class BucketGroup
{
public int Id {get;set;} // This is the PK in the Table
public string Name {get;set;}
// Now this the FK, to this Same Table:
public int? BucketGroupId {get;set;}
}
所以我将这个项目设置为 Nullable,如果 BucketGroupId
是 NULL 那么我知道它是一个父项目。
我创建了一个测试项目并使用数据库优先,模型是这样的:
public partial class Testing
{
public Testing()
{
this.Testing1 = new HashSet<Testing>();
}
public int Id { get; set; }
public Nullable<int> ParentId { get; set; }
public virtual ICollection<Testing> Testing1 { get; set; }
public virtual Testing Testing2 { get; set; }
}
因此,如果我向我的模型添加一个类似的 属性 是否会使它成为 PK
ID 的 FK
?
public class BucketGroup
{
public int Id {get;set;} // This is the PK in the Table
public string Name {get;set;}
// Now this the FK, to this Same Table:
public int? BucketGroupId {get;set;}
public virtual ICollection<BucketGroup> BucketGroup1 { get; set; }
}
这是正确的吗?
您有两种选择:
-
public class BucketGroup { public int Id {get;set;} public string Name {get;set;} [ForeignKey("ParentBucketGroup")] public int? ParentBucketGroupId {get;set;} public virtual BucketGroup ParentBucketGroup {get;set;} public virtual ICollection<BucketGroup> Children { get; set; } }
或者,使用 Fluent Api:
public class BucketGroup { public int Id {get;set;} public string Name {get;set;} public int? ParentBucketGroupId {get;set;} public virtual BucketGroup ParentBucketGroup {get;set;} public virtual ICollection<BucketGroup> Children { get; set; } }
并且,要配置关系,您可以在上下文中覆盖
OnModelCreating
方法:modelbuilder.Entity<BucketGroup>().HasOptional(b=>b.ParentBucketGroup ) .WithMany(b=>b.Children ) .HasForeignKey(b=>b.ParentBucketGroupId);
更新
如果需要,您可以使用单向(也称为单向)关系,但您需要保留其中之一。
如果您删除 Children
导航 属性,那么,您的配置将是这样的:
modelbuilder.Entity<BucketGroup>().HasOptional(b=>b.ParentBucketGroup)
.WithMany()
.HasForeignKey(b=>b.ParentBucketGroupId);
或者,如果您删除 ParentBuketGroup
导航。 属性,那么你需要这样做:
modelbuilder.Entity<BucketGroup>().HasOptional()
.WithMany(b=>b.Children)
.HasForeignKey(b=>b.ParentBucketGroupId);