我不得不提出一个新问题,因为我上一篇帖子的关注度不够. 我正在为一群朋友做一个网络应用程序的概念验证.我正在使用一个带有虚拟数据的模拟数据库,这样我就可以测试我的API.我正在try 使用我的模拟数据库中的数据随机填充对象"奖"的列表.注意:我的实际数据库将有一个用于AwardsToTroopers的表来处理多对多关系.我不会在这里这样做,因为这只是一个模型,展示一个专用的Web应用程序比1000个相互链接的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);
在我保存更改之前.使用调试器,我能够看到只有最后两个条目实际上保存了Awards.说大也大吧.它保留了奖项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}]
为什么它不 for each 士兵保留完整的奖励对象?我做错了什么?
编辑:应@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; }
}
}
Award.cs
using System;
namespace ORBAT.Lib
{
public class Award
{
public int Id { get; set; }
public String Name { get; set; }
}
}