使用 Entity Framework 6 填充对象中的列表会导致大部分列表为空

问题描述 投票:0回答:1

由于我的上一篇文章不够集中,我不得不提出一个新问题。 我正在为一群朋友进行网络应用程序的概念验证。我使用带有虚拟数据的模拟数据库,这样我就可以测试我的 API。我正在尝试使用模拟数据库中的数据随机填充对象“Award”的列表。注意:我的实际数据库将有一个 AwardsToTroopers 表来处理多对多关系。我在这里不这样做,因为这只是一个模型,旨在展示专用网络应用程序与一千个相互链接的 Google 表格相比要好得多。

foreach (var i in Enumerable.Range(1,50))
{
    db.Troopers.Add(new Trooper 
    {
        Id = i,
        Name = $"Trooper {i}",
        Callsign = $"TK-{i}",
        Awards = db.Awards.Where(award => i % award.Id == 0).ToList()
    };
}
db.SaveChanges();

通过我上一篇文章提供的两个解决方案,我能够看到奖项列表已填充并正确附加到士兵。然而,当我从数据库中获取所有士兵的列表时,奖项列表将为空。

我尝试了@Amit Mohanty 写的

var awardsList = db.Awards.ToList();

foreach (var i in Enumerable.Range(1, 50))
{
    db.Troopers.Add(new Trooper
    {
        Id = i,
        Name = $"Trooper {i}",
        Callsign = $"TK-{i}",
        Awards = awardsList.Where(award => i % award.Id == 0).ToList()
    });
}

这是@aiapatag 写的

foreach (var i in Enumerable.Range(1, 50))
{
    var trooper = new Trooper
    {
        Id = i,
        Name = $"Trooper {i}",
        Callsign = $"TK-{i}"
    };

    var awards = db.Awards.Where(award => i % award.Id == 0).ToList();
    
    // Attach the awards to the context
    foreach (var award in awards)
    {
        db.Awards.Attach(award);
    }

    trooper.Awards = awards;
    db.Troopers.Add(trooper);
}

并添加了

db.ChangeTracker.DetectChanges();
Debug.WriteLine(db.ChangeTracker.DebugView.LongView);

在保存更改之前。通过调试器,我可以看到只有最后两个条目实际上保留了奖项。有点。它保留了奖项 ID,但完全放弃了名称。

Trooper {Id: 1} Added
  Id: 1 PK
  Name: 'Trooper 1'
  Callsign: 'TK-1'
  Awards: []
Trooper {Id: 2} Added
  Id: 2 PK
  Name: 'Trooper 2'
  Callsign: 'TK-2'
  Awards: []
Trooper {Id: 3} Added
  Id: 3 PK
  Name: 'Trooper 3'
  Callsign: 'TK-3'
  Awards: []
...
Trooper {Id: 49} Added
  Id: 49 PK
  Name: 'Trooper 49'
  Callsign: 'TK-49'
  Awards: [{Id: 3}]
Trooper {Id: 50} Added
  Id: 50 PK
  Name: 'Trooper 50'
  Callsign: 'TK-50'
  Awards: [{Id: 1}, {Id: 2}]

为什么不为每个士兵保留完整的奖励对象?我做错了什么?

编辑:应@Yitz的要求,这是我对士兵和奖励的定义。

Trooper.cs

using System;
using System.Collections.Generic;

namespace ORBAT.Lib
{
    public class Trooper
    {
        public int Id { get; set; }

        public String Name { get; set; }

        public String Callsign { get; set; }

        public virtual ICollection<Award> Awards { get; set; }
    }
}

奖.cs

using System;

namespace ORBAT.Lib
{
    public class Award
    {
        public int Id { get; set; }

        public String Name { get; set; }
    }
}
c# entity-framework
1个回答
0
投票

您已经创建了一对多关系,即一个

Trooper
可以有多个
Award
,但一个
Award
只能属于一个
Trooper
。为了创建多对多关系,您需要将
Troopers
集合添加到您的
Award
类中:

public class Award
{
    //...

    public virtual ICollection<Trooper> Troopers { get; set; }
}

© www.soinside.com 2019 - 2024. All rights reserved.