C# 如何首先在EF代码中创建多个一对一关系?
第三次编辑:在问题结束时更改了大量代码,保留了原始代码以防万一 我在理解如何处理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
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);