【发布时间】:2017-09-03 02:12:35
【问题描述】:
我正在使用 Entity Framework 6 Code First 并遇到问题,即多对多关系未正确同步到我的“内部”对象。
我有以下课程:
public class ClassA
{
public String AId { get; set; }
public ICollection<ClassB> Bs { get; set; }
public ICollection<ClassC> Cs { get; set; }
}
public class ClassB
{
public int BId { get; set; }
ICollection<ClassA> As { get; set; }
}
public class ClassC
{
public int CId { get; set; }
public ClassA A { get; set; }
}
A 和 B 具有多对多关系,而 A 和 C 具有一对多关系。我使用 Fluent API 来构建映射:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ClassA>().ToTable("ClassA");
modelBuilder.Entity<ClassA>().HasKey(a => a.AId);
modelBuilder.Entity<ClassA>().HasManyClassB>(a => a.Bs).WithMany(b => b.As).Map(
a =>
{
a.MapLeftKey("AId");
a.MapRightKey("BId");
a.ToTable("ClassAClassB");
});
modelBuilder.Entity<ClassA>().Property(a => a.OrderId).IsVariableLength().HasColumnName("AId");
modelBuilder.Entity<ClassB>().ToTable("ClassB");
modelBuilder.Entity<ClassB>().HasKey(b => b.BId);
modelBuilder.Entity<ClassB>().Property(b => b.BId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
.HasColumnName("BId");
modelBuilder.Entity<ClassC>().ToTable("ClassC");
modelBuilder.Entity<ClassC>().HasKey(c => c.CId);
modelBuilder.Entity<ClassC>().HasRequired(c => c.A).WithMany(a => a.Bs).Map(m => m.MapKey("AId"));
modelBuilder.Entity<ClassC>().Property(c => c.CId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
.HasColumnName("CId");
}
如果我创建 ClassA、ClassB 和 ClassC 类的对象,请将它们添加到我的数据库上下文并调用 SaveChanges()。在我看来,这些值正确地存储在数据库中:
MariaDB [Test]> select * from ClassA;
+----------+
| BId |
+----------+
| 2017-002 |
+----------+
MariaDB [Test]> select * from ClassB;
+--------+
| BId |
+--------+
| 2 |
+--------+
MariaDB [OMSData]> select * from ClassAClassB;
+----------+-----+
| AId | BId |
+----------+-----+
| 2017-002 | 2 |
+----------+-----+
MariaDB [Test]> select * from classC;
+----+-----------+
| CId | AId |
+-----+----------+
| 1 | 2017-002 |
+-----+----------+
但是,如果我再次执行我的测试程序,则无法正确恢复关系。
这意味着:
- ClassA 中 B 的集合不包含任何对象(反之亦然)。
- 如果我事先通过我的数据库上下文访问了这个对象,我只能通过 ClassA 访问 ClassC 的对象。
我必须手动调用同步还是模型定义有错误?
提前致谢!
【问题讨论】:
-
用于从数据库中具体化对象的代码在这里可能很有用。根据上下文配置,使用 .Include() 可能是个问题。
标签: c# database entity-framework ado.net entity-framework-6