由于我的上一篇文章不够集中,我不得不提出一个新问题。 我正在为一群朋友进行网络应用程序的概念验证。我使用带有虚拟数据的模拟数据库,这样我就可以测试我的 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; }
}
}
您已经创建了一对多关系,即一个
Trooper
可以有多个 Award
,但一个 Award
只能属于一个 Trooper
。为了创建多对多关系,您需要将 Troopers
集合添加到您的 Award
类中:
public class Award
{
//...
public virtual ICollection<Trooper> Troopers { get; set; }
}