我不得不提出一个新问题,因为我上一篇帖子的关注度不够. 我正在为一群朋友做一个网络应用程序的概念验证.我正在使用一个带有虚拟数据的模拟数据库,这样我就可以测试我的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; }
    }
}

推荐答案

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

public class Award
{
    //...

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

Csharp相关问答推荐

[0-n]范围内有多少个Integer在其小数表示中至少包含一个9?

ASP.NET Core 8 Cors标题未显示

为什么我在PuppeteerSharp中运行StealthPlugin时会出现错误?

为什么使用DXGI输出复制和Direct 3D时捕获的图像数据全为零?

Plotly.NET访问互联网时出现异常

ASP.NET Core:如何在IPageFilter中注入ApplicationDbContext

在多对多关系上不删除实体

在一个模拟上设置一个方法,该模拟具有一个参数,该参数是一个numc函数表达式

Rider将.NET安装在哪里

ASP.NET配置kestrel以使用Windows证书存储中的HTTPS

Automapper 12.x将GUID映射到字符串

确定System.Text.Json序列化中是否无法识别Type

有没有更好的方法来在CosmosDB上插入非id?

在Windows Plesk上发布ASP.NET Core 7 Web API-错误:无法加载文件或程序集';Microsoft.Data.SqlClient';

用于请求用户返回列表的C#Google API

毛伊岛.NET 8图片不再适合按钮

如何正确地在VB中初始化类?

如何从原始图像到新创建的图像获得相同的特定 colored颜色 ,并且具有相同的 colored颜色 量和相同的宽度和高度?

如何在C# WinForm控件中使用Windows 10/11的黑暗主题?

读取测试项目中的应用程序设置