如何在播种过程中将一个实体ID传递给另一个实体?

本文关键字:实体 ID 一个 另一个 过程中 | 更新日期: 2023-09-27 18:12:29

我有这样一个类:

public class Reservation
{
    public int ID { get; set; }
    public int SpaceNumber { get; set; }
    public string UserName{ get; set; }
    public virtual Game Game { get; set; }
    public Reservation() { }
}

我正在尝试设置一些种子,但我不确定如何将GameID传递到此。下面是一个例子:

public class TTUInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<TTUContext>
{
    protected override void Seed(TTUContext context)
    {
        var reservation = new List<Reservation>
        {
            new Reservation{SpaceNumber=123, UserName="username", Game_ID=1},
            new Reservation{SpaceNumber=124, UserName="username", Game_ID=1},
        };
        reservation.ForEach(r => context.Reservations.Add(r));
        context.SaveChanges();
    }
}

Game_ID是数据库列的名称-但是当我尝试将其添加为属性时,迁移生成了一个新的(第二个)Game_ID1列。正确的做法是什么?

如何在播种过程中将一个实体ID传递给另一个实体?

您需要检索Game实例并为该实例设置Game属性。Game_ID是用于保存对游戏id的引用的字段,但这是实体框架,它处理实体,而不是id。这意味着是一个抽象,所以如果你需要显式地设置引用ID,你需要破解系统,并通过ADO.NET设置。

要公开相关实体的ID,如您所料,需要将其定义为属性。但是,您还需要告诉EF这个属性是一个外键。尝试像这样在模型中定义关系:

public class Reservation
{
    public int ID { get; set; }
    public int SpaceNumber { get; set; }
    public string UserName{ get; set; }
    [ForeignKey("Game")]
    public int GameID{ get; set;}
    public virtual Game Game { get; set; }
    public Reservation() { }
}

如果Game不存在,就创建一个新实例,如果它存在,就从上下文获取它。

Game_ID列不需要作为属性出现在你的类中(它可能有用,但不是必须的),你总是可以使用Game.Id,但当然当你创建一个关系时,你需要一个game的实例。

var game = new Game{Id = 1};//or context.Games.FirstOrDefault(m => m.Id == 1);

和实例化您的预订

new Reservation{SpaceNumber=123, UserName="username", Game = game},
new Reservation{SpaceNumber=124, UserName="username", Game = game},