如何在播种过程中将一个实体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列。正确的做法是什么?
您需要检索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},