程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了带有 Entity Framework Core 5 的自引用表大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决带有 Entity Framework Core 5 的自引用表?

开发过程中遇到带有 Entity Framework Core 5 的自引用表的问题如何解决?下面主要结合日常开发的经验,给出你关于带有 Entity Framework Core 5 的自引用表的解决方法建议,希望对你解决带有 Entity Framework Core 5 的自引用表有所启发或帮助;

我的应用中有一个自引用实体。与其他包类型具有依赖关系(作为列表)的包类型。我正在尝试使用模型构建器设计所需的中间表。不幸的是,我无法正确填写密钥。

system.invalIdoperationException: '无法跟踪类型为 'PackageDependency (Dictionary)' 的实体,因为其主键属性 'DependencyID' 为空。'

    public class PackageType
    {
        [Key]
        public String Tag { get; set; }

        public virtual List<PackageType> DependencIEs { get; set; } = new List<PackageType>();
    }

数据库上下文:

 protected overrIDe voID OnModelCreaTing(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<PackageType>()
                .Hasmany(p => p.DependencIEs)
                .WithMany(p => p.DependencIEs)
                .UsingEntity<Dictionary<String,object>>(
                    "PackageDependency",j => j
                        .HasOne<PackageType>()
                        .WithMany()
                        .HasForeignKey("PackagEID")
                        .HasConsTraintname("FK_PackageDependency_PackagEID")
                        .ondelete(deleteBehavior.CascadE),j => j
                        .HasOne<PackageType>()
                        .WithMany()
                        .HasForeignKey("DependencyID")
                        .HasConsTraintname("FK_PackageDependency_DependencyID")
                        .ondelete(deleteBehavior.ClIEntCascadE),e => e.HasKey("PackagEID","DependencyID"));
        }

有人给我提示吗?

非常感谢!

解决方法

我很惊讶 EF Core 竟然允许这样做

.Hasmany(p => p.Dependencies)
.WithMany(p => p.Dependencies)

(关系双方使用同一个集合)不报错。

@H_824_2@many-to-many 需要 2 个集合导航属性 - 关系的每一侧一个。所以即使这是自引用关系,它仍然需要绑定到相应的连接实体 FK 的 2 个单独集合导航属性。例如

public virtual List<PackageType> ChildDependencies { get; set; } = new List<PackageType>();
public virtual List<PackageType> ParentDependencies { get; set; } = new List<PackageType>();

.Hasmany(p => p.ChildDependencies) // -> j.PackagEID
.WithMany(p => p.parentDependencies) // -> j.DependencyId
,

你需要两个参,一个是向上的,一个是向下的:

public class PackageType
{
    [Key]
    public String Tag { get; set; }

    public ICollection<PackageDependency> Dependents { get; set; }
    public ICollection<PackageDependency> Pendents { get; set; }
}

public class PackageDependency
{
    public String DependentTag { get; set; }
    public PackageType Dependend { get; set }
    public String PendentTag { get; set; }
    public PackageType Pendend { get; set; }
}


protected override void OnModelCreaTing(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<PackageDependency>()
            .HasKey(r => new { r.DependentTag,r.PendentTag });
    modelBuilder.Entity<PackageDependency>()
        .HasOne(r => r.Pendend)
        .WithMany(p => p.Dependents)
        .Isrequired()
        .ondelete(deleteBehavior.NoAction);
    modelBuilder.Entity<PackageDependency>()
        .HasOne(r => r.Dependend)
        .WithMany(d => d.Pendents)
        .Isrequired()
        .ondelete(deleteBehavior.NoAction);
}

大佬总结

以上是大佬教程为你收集整理的带有 Entity Framework Core 5 的自引用表全部内容,希望文章能够帮你解决带有 Entity Framework Core 5 的自引用表所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:5Core带有