3

我在使用 EF 将数据存储到数据库时遇到问题。通常所有 CRUD 操作对于程序的其余部分都可以正常工作,但最近我注意到,在 m:n 关系的情况下,棘手的部分来了。

我正在使用带有代码优先方法的 EF4.1。我的课程中有趣的部分如下所示:

public class Publication : IItem, IDataErrorInfo {

     ...

    [InverseProperty("Publications")]
    public virtual ICollection<Group> Groups{ get; set; }
}

public class Group : IItem, IDataErrorInfo {

     ...

    [InverseProperty("Groups")]
    public virtual ICollection<Publication> Groups{ get; set; }
}

数据库创建如下:

    public PublicationsDB() : base("PublicationDB") {
        this.Configuration.AutoDetectChangesEnabled = true;
    }

    public DbSet<Publication> Publications { get; set; }
    public DbSet<Software> Softwares { get; set; }
    public DbSet<Group> Group{ get; set; }

目的是在出版物和组之间创建 m:n 关系。

最近我从 XML 导入数据时,一切都很好。在调用 SaveChanges() 之后,出版物和组都存储了它们的 ICollection。在下面几行相同的方法中,我从数据库中获取数据(仅用于检查),并且再次填充了两个实体的 ICollection。

麻烦来了:

在执行不同的数据操作函数时,我从数据库中挖掘数据并:

  • 出版物的集合很好,实体的啤酒已经ICollection<Group>从 xml 中正确填充
  • 但是组的集合非常混乱。他们中的大多数都ICollection<Publication>设置为空。

问题可能是什么?这种行为对我来说真的很奇怪。最后但并非最不重要的一点是,删除 Collections fromDBSet<Groups>不是确定性的。我的意思是,如果我们考虑 A 组和 B 组,而不是在程序的一次运行中,A.ICollection = null and B.ICollection.Count =1 (which is by the way wrong)而在另一次运行中是不同的,即A.ICollection = null and B.ICollection = null (which is also wrong)

有任何想法吗?

构建代码第一个数据库时模型混乱?框架错误或奇怪的内部框架优化?还是我只是个混蛋?:)

我也在考虑通过在其中放置一个新实体来改变关系。即转移Publication (m):(n) Group到类似的东西Publication (m):(1) NewEntityRelation (n):1 Group,但如果有的话,我宁愿选择不同的解决方案。

谢谢您的回复。

4

1 回答 1

3

除非我弄错了,否则 InverseProperty 属性可帮助 EF 将关系的一侧与另一侧配对,但它不会告诉 EF 任何关于它是哪种关系的信息。我假设当您说要创建“m:n”关系时,您的意思是“多对多”,我发现 EF 并不总是能正确计算出来。我已经养成了通过重写 OnModelCreating 方法为多对多关系手动指定映射的习惯。以下是示例代码片段:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasMany(a => a.Roles)
            .WithMany(r => r.Users)
            .Map(config =>
            {
                config.ToTable("UserRoles");
                config.MapLeftKey("UserId");
                config.MapRightKey("RoleId");
            });
    }

上面的代码片段取自我的一个项目,它用于定义用户及其在系统中的角色之间的多对多关系。这样,EF 就不会“混淆”什么样的关系、数据库中的中间表的名称或用于将一侧映射到另一侧的键。我不确定你为什么只在关系的一侧看到问题,但我敢打赌这是因为 EF 无法完全弄清楚你想要做什么。

于 2012-06-08T13:14:30.640 回答