Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何首先在EF代码中创建多个一对一关系?_C#_Asp.net Mvc_Entity Framework_Ef Code First_Entity Framework 6 - Fatal编程技术网

C# 如何首先在EF代码中创建多个一对一关系?

C# 如何首先在EF代码中创建多个一对一关系?,c#,asp.net-mvc,entity-framework,ef-code-first,entity-framework-6,C#,Asp.net Mvc,Entity Framework,Ef Code First,Entity Framework 6,第三次编辑:在问题结束时更改了大量代码,保留了原始代码以防万一 我在理解如何处理EF中的多个一对一关系时遇到问题。我已经在两个模型之间建立了一对一的关系,但是当我试图在组合中添加另一个模型一对一的关系时,事情变得很糟糕。第二次编辑:我现在正在使用复合键,因为数据库中还有其他关系似乎在使用它们。在处理一对一关系时仍然存在问题,下面是代码: 首先,我得到了父母中的一个: public class CodigoAgrupadorCuentas { [Key] [Column(Order

第三次编辑:在问题结束时更改了大量代码,保留了原始代码以防万一

我在理解如何处理EF中的多个一对一关系时遇到问题。我已经在两个模型之间建立了一对一的关系,但是当我试图在组合中添加另一个模型一对一的关系时,事情变得很糟糕。第二次编辑:我现在正在使用复合键,因为数据库中还有其他关系似乎在使用它们。在处理一对一关系时仍然存在问题,下面是代码:

首先,我得到了父母中的一个:

public class CodigoAgrupadorCuentas
{
   [Key]
    [Column(Order = 0)]
    [StringLength(36)]
    public string CompanyID { get; set; }

    [Key]
    [Column(Order = 1)]
    [StringLength(36)]
    public string DivisionID { get; set; }

    [Key]
    [Column(Order = 2)]
    [StringLength(36)]
    public string DepartmentID { get; set; }

    [Key]
    [Column(Order = 3)]
    [Required]
    public int CodigoAgrupadorCuentasID { get; set; }

    [Required]
    public string Code { get; set; }

    public virtual CatalogoDeCuentas CatalogoDeCuentas { get; set; }
}
这是一个有双亲的孩子:

public class CatalogoDeCuentas 
{
    public CatalogoDeCuentas()
    { }
     [Key]
    [Column(Order = 0)]
    [StringLength(36)]
    public string CompanyID { get; set; }

    [Key]
    [Column(Order = 1)]
    [StringLength(36)]
    public string DivisionID { get; set; }

    [Key]
    [Column(Order = 2)]
    [StringLength(36)]
    public string DepartmentID { get; set; }

    [Key]
    [Column(Order = 3)]
    [Required]
    public int CatalogoDeCuentasID { get; set; }

    public string Information { get; set; }

    public virtual CodigoAgrupadorCuentas CodigoAgrupadorCuentas { get; set; }

    public virtual LedgerChartOfAccount LedgerChartOfAccount { get; set; } 

}
}
第二父类:

public partial class LedgerChartOfAccount
{
    [Key]
    [Column(Order = 0)]
    [StringLength(36)]
    public string CompanyID { get; set; }

    [Key]
    [Column(Order = 1)]
    [StringLength(36)]
    public string DivisionID { get; set; }

    [Key]
    [Column(Order = 2)]
    [StringLength(36)]
    public string DepartmentID { get; set; }

    [Key]
    [Column(Order = 3)]
    [StringLength(36)]
    public string GLAccountNumber { get; set; }

    public string description { get; set; }


    public virtual CatalogoDeCuentas CatalogoDeCuentas { get; set; }
}
最后,这里是上下文:

public class PolizasDBContext: DbContext
{
      public PolizasDBContext()
        : base("PolizasDBContext")
    { 

    }

      public DbSet<CatalogoDeCuentas> TablaCatalogoDeCuentas { get; set; }
      public DbSet<CodigoAgrupadorCuentas> TablaCodigoAgrupCuentas { get; set; }
      public DbSet<LedgerChartOfAccount> TablaChartAccounts { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
       modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<LedgerChartOfAccount>()
          .HasKey(x => new { x.CompanyID, x.DivisionID, x.DepartmentID, x.GLAccountNumber });

        modelBuilder.Entity<CatalogoDeCuentas>()
            .HasKey(x => new { x.CatalogoDeCuentasID, x.CompanyID, x.DivisionID, x.DepartmentID });

        modelBuilder.Entity<CodigoAgrupadorCuentas>()
            .HasKey(x => new { x.CodigoAgrupadorCuentasID, x.CompanyID, x.DivisionID, x.DepartmentID });

        modelBuilder.Entity<CatalogoDeCuentas>()
            .HasRequired(x => x.CodigoAgrupadorCuentas)
            .WithOptional(x => x.CatalogoDeCuentas)
            .Map( x => x.MapKey("CompanyID"));

        modelBuilder.Entity<CatalogoDeCuentas>()
           .HasRequired(x => x.LedgerChartOfAccounts)
           .WithOptional(x => x.CatalogoDeCuentas)
           .Map(x => x.MapKey("CompanyID"));

        base.OnModelCreating(modelBuilder);

    }
从Codigo Agrupador中删除了复合键,因为从我所读到的内容来看,我不一定需要它们来完成这项工作。还从CatalogoDeCuentas中删除了virtual关键字virtual,因为我有一个错误,我将在最后显示。但无论如何,我也改变了:

public class CatalogoDeCuentas 
{
    public CatalogoDeCuentas()
    { }

    [Key]
    [Column(Order = 0)]
    [Required]
    public int CatalogoDeCuentasID { get; set; }

    [Key]
    [Column(Order = 1)]
    [StringLength(36)]
    [Required]
    public string GLAccountNumber { get; set; }

    public string Information { get; set; }

    public CodigoAgrupadorCuentas CodigoAgrupadorCuentas { get; set; }

    public LedgerChartOfAccount LedgerChartOfAccount { get; set; } 

}
}
几乎相同的更改,只是在本例中,我想将CatalogoDeCuentas和LedgerAccountOfChart与GLAccountNumber链接,这就是为什么我将其添加为键

另一个重大变化是在环境方面:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<CatalogoDeCuentas>()
            .HasRequired(x => x.CodigoAgrupadorCuentas)
            .WithOptional(x => x.CatalogoDeCuentas);

        modelBuilder.Entity<CatalogoDeCuentas>()
           .HasRequired(x => x.LedgerChartOfAccounts)
           .WithOptional(x => x.CatalogoDeCuentas);

        base.OnModelCreating(modelBuilder);

    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Entity()
.HasRequired(x=>x.codigoagraupadorcuentas)
.可选(x=>x.CatalogoDeCuentas);
modelBuilder.Entity()
.has必需(x=>x.ledgerchartofcounts)
.可选(x=>x.CatalogoDeCuentas);
基于模型创建(modelBuilder);
}
让它简单多了。我对发布的原始代码中的LedgerChartOfAccounts所做的唯一更改是删除CatalogoDeCuentas中的虚拟词

现在,当我尝试搭建脚手架时,我得到了下一个错误:

这就是我目前所处的位置。。。帮助?

要使其成为(一对一)
ledgerchartofcount
的主键应为
public int-CatalogoDeCuentasID{get;set;}

在模型生成器中,您的配置应如下所示:

modelBuilder.Entity<LedgerChartOfAccount>()
                   .HasKey(x => x.CatalogoDeCuentasID);

modelBuilder.Entity<LedgerChartOfAccount>()
            .HasRequiredPrincipal(x => x.CatalogoDeCuentas)
            .WithRequired(x => x.LedgerChartOfAccount);
modelBuilder.Entity()
.HasKey(x=>x.CatalogoDeCuentasID);
modelBuilder.Entity()
.HasRequiredPrincipal(x=>x.CatalogoDeCuentas)
.带必填项(x=>x.ledgerchartofcount);

有关更多信息,请查看

小说明。命名像
EntityTypeNameID
这样的主键属性有什么意义?比较一下:
codigoargrupadorCuentas.codigoargrupadorCuentasid
和这个:
codigoargrupadorCuentas.Id
。我对这一点还是新手,刚开始时在线阅读的一些教程总是建议对字段进行描述。我可以更改它们,但据我所知,这应该不是问题。
LedgerChartOfAccount
的主键是什么?它应该是GLAccountNumber。在这种情况下没有命名它的ID@AndresRamosI用许多新的细节修改了我的问题,现在我使用复合键。
modelBuilder.Entity<LedgerChartOfAccount>()
                   .HasKey(x => x.CatalogoDeCuentasID);

modelBuilder.Entity<LedgerChartOfAccount>()
            .HasRequiredPrincipal(x => x.CatalogoDeCuentas)
            .WithRequired(x => x.LedgerChartOfAccount);