簡體   English   中英

如何首先在EF代碼中創建多個一對一關系?

[英]How to create Multiple one-to-one relationships in EF Code first?

第三修改:在問題的末尾更改了很多代碼,保留了原始代碼,以防萬一

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

    }

在這一點上,當我嘗試腳手架時,我得到下一個錯誤:

腳手架錯誤

簡介:如何保持CodigoAgrupadorCuentas和CatalogoDeCuentas之間的一對一關系,同時在LedgerChartOfAccount和Catalogo de Cuentas之間保持一對一的關系?

第一次編輯:忘記提及了,GLAccountnumber應該是LedgerChartOfAccounts鍵。

第三編輯:

仍在嘗試解決此問題,老實說,我不知道為什么我要為此付出如此多的努力,從我所做的所有研究來看,它應該很簡單。 我再次對上面的代碼進行了大量更改。 這是更改:

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

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

    public CatalogoDeCuentas CatalogoDeCuentas { get; set; }
}

從Codigo Agrupador中刪除了Composite鍵,因為從我閱讀的內容來看,我不一定需要它們來完成這項工作。 還從CatalogoDeCuentas中刪除了虛擬關鍵字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);

    }

簡化了很多。 我對發布的原始代碼對LedgerChartOfAccounts所做的唯一更改是刪除了CatalogoDeCuentas中的虛擬單詞。

現在,當我嘗試腳手架時,出現下一個錯誤:

新腳手架錯誤

到目前為止,這就是我的...幫助嗎?

要使其成為(一對一), LedgerChartOfAccount應該具有public int CatalogoDeCuentasID {get; set;} public int CatalogoDeCuentasID {get; set;}

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

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

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

有關更多信息,請查看使用Fluent API配置關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM