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

时间:2014-09-29 19:01:31

标签: c# asp.net-mvc entity-framework ef-code-first entity-framework-6

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

我在理解如何使用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);

    }

此时,我尝试搭建时会出现下一个错误:

Scaffolding Error

总结:在CodigoAgrupadorCuentas和CatalogoDeCuentas之间保持一对一的关系,同时在LedgerChartOfAccount和Catalogo de Cuentas之间建立一对一的关系会是什么样的方式?

First Edit:忘记提及,GLAccountnumber被认为是LedgerChartOfAccounts Key。

第三编辑:

仍然试图解决这个问题,老实说我不知道​​为什么我会这么挣扎,从我所做的所有研究来看,它应该很简单。我再次对上面的代码做了很多更改。这是变化:

 public class CodigoAgrupadorCuentas
{
    [Key]
    [Required]
    public int CodigoAgrupadorCuentasID { get; set; }

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

    public CatalogoDeCuentas CatalogoDeCuentas { get; set; }
}

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

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);

    }

简化了一下。我从发布的原始代码中对LedgerChartOfAccounts所做的唯一更改是删除CatalogoDeCuentas中的虚拟词。

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

New Scaffold Error

这就是我到目前为止......帮助?

1 个答案:

答案 0 :(得分:0)

为了它(一对一)LedgerChartOfAccount应该有一个public int CatalogoDeCuentasID {get; set;}的主键

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

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

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

有关详细信息,请查看Configuring Relationships with the Fluent API