【问题标题】:Entity Framework mapping self reference实体框架映射自引用
【发布时间】:2016-08-23 06:34:04
【问题描述】:

我正在使用 Entity Framework Core 1 或“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”

我真的不知道我在做什么。

【问题讨论】:

  • 您是否尝试过使用脚手架命令生成代码优先类和映射,或者它们是手动编写的?

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


【解决方案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

【讨论】:

  • 谢谢你的回答,但是当Unidade没有IdUnidadePai但是是orthers的父亲时,它是行不通的。示例 new Unidade() {IdUnidade = 1, IdUnidadePai = null }; new Unidade() {IdUnidade = 2, IdUnidadePai = 1 }.. 当我按 IdUnidade = 1 搜索时,它应该带一个元素的 InverseIdUnidadePaiNavigation。
猜你喜欢
  • 2016-01-18
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 2011-03-09
  • 2014-04-01
  • 2011-05-06
  • 2011-08-30
相关资源
最近更新 更多