實體框架映射自我引用

c# entity-framework entity-framework-core linq mapping

我正在使用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來搜索
  • 我一無所獲
  • 我得到一個例外,其中包含“附加信息:無效的列名稱'IdUnidade1'。無效的列名'IdUnidadePai1'。”
  • 我得到一個例外,其中包括“附加信息:無效列UnidadePaiIdUnidade”

我真的不知道我做了什麼。

熱門答案

我已經嘗試為數據庫表生成代碼第一個類,你已經發布了。那就是結果:

    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



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因