实体框架映射自我引用

时间:2016-04-28 13:06:22

标签: c# entity-framework linq mapping entity-framework-core

我正在使用Entity Framework Core 1 ou" 7.0.0-rc1-final"。我试图做一个实体自我参考,但它不起作用。按照例子:

public class Unidade
{
    [Key]
    public Int32 IdUnidade { get; set; }
    public Int32? IdUnidadePai { get; set; }
    public String Nome { get; set; }
    public ICollection<Unidade> LstFilhos { get; set; }
    public Unidade UnidadePai { get; set; }
}

按照映射:

public UnidadeConfiguration(EntityTypeBuilder<Unidade> paramModelBuilder)
{
    paramModelBuilder.HasKey(x => x.IdUnidade);

    paramModelBuilder.HasMany(x => x.LstFilhos)
            .WithOne(x => x.UnidadePai)
            .HasForeignKey(c => c.IdUnidadePai);

    paramModelBuilder.ToTable("Unidade","Unidade");
}

我已经尝试过:

    paramModelBuilder.HasOne(x => x.UnidadePai)
            .WithMany(x => x.LstFilhos)
            .HasForeignKey(x => x.IdUnidade);

试试这个:

paramModelBuilder.HasMany(x => x.LstFilhos)
            .WithOne(x => x.UnidadePai)
            .HasForeignKey("IdUnidade", "IdUnidadePai");

我的数据库sql:

CREATE TABLE [Unidade].[Unidade](
    [IdUnidade] [int] IDENTITY(1,1) NOT NULL,
    [IdUnidadePai] [int] NULL,
    [Nome] [varchar](100) NOT NULL,
    CONSTRAINT [PK_Unidade] PRIMARY KEY CLUSTERED 
    (
        [IdUnidade] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING ON
GO

ALTER TABLE [Unidade].[Unidade]  WITH CHECK ADD CONSTRAINT [FK_Unidade_Unidade]
    FOREIGN KEY([IdUnidadePai])
REFERENCES [Unidade].[Unidade] ([IdUnidade])
GO

ALTER TABLE [Unidade].[Unidade] CHECK CONSTRAINT [FK_Unidade_Unidade]
GO

所以,当我尝试将一个元素作为元素时,我有一些场景:

  • 我得到永恒的循环,总是通过id 1
  • 来搜索
  • 我什么都没得到
  • 我获得了一个例外,其中包含了以下内容&#34;其他信息:列名称无效&#39; IdUnidade1&#39;。列名称无效&#39; IdUnidadePai1&#39;。&#34;
  • 我得到了一个例外,其中包含了以及#34;其他信息:无效列UnidadePaiIdUnidade&#34;

我真的不知道自己做了什么。

1 个答案:

答案 0 :(得分:1)

我已经尝试为数据库表生成代码第一个类,你已经发布了。那就是结果:

    public partial class Unidade
    {
        public int IdUnidade { get; set; }
        public int? IdUnidadePai { get; set; }
        public string Nome { get; set; }

        public virtual Unidade IdUnidadePaiNavigation { get; set; }
        public virtual ICollection<Unidade> InverseIdUnidadePaiNavigation { get; set; }
     }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Unidade>(entity =>
        {
            entity.HasKey(e => e.IdUnidade);

            entity.Property(e => e.Nome)
                .IsRequired()
                .HasMaxLength(100)
                .HasColumnType("varchar");

            entity.HasOne(d => d.IdUnidadePaiNavigation).WithMany(p => p.InverseIdUnidadePaiNavigation).HasForeignKey(d => d.IdUnidadePai);
        });
    }

如果你想尝试自己生成这些,我使用了以下命令:

dnx ef dbcontext scaffold "Data Source=.;Initial Catalog=Unidade;Integrated Security=True;MultipleActiveResultSets=True" EntityFramework.MicrosoftSqlServer

当然,您必须根据数据库设置更改连接字符串名称。您可以在此处阅读详细解释:Entity Framework 7 DbContext scaffold