第三次编辑:在问题结束时更改了我的大量代码,保留了原始内容以防万一()。
我在理解如何使用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之间建立一对一的关系会是什么样的方式?
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中的虚拟词。
现在,当我尝试脚手架时,我得到了下一个错误:
这就是我到目前为止......帮助?
答案 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);