【问题标题】:How do I pass an en entity ID to another entity during the seeding process?如何在播种过程中将 en 实体 ID 传递给另一个实体?
【发布时间】:2014-07-11 21:24:59
【问题描述】:

我有这门课:

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 列。什么是正确的播种?

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework


    【解决方案1】:

    您需要检索 Game 实例并将 Game 属性设置为该实例。 Game_ID 是用于保存对 Game id 的引用的字段,但这是 Entity 框架,它处理的是实体,而不是 id。它是一种抽象,因此如果您需要明确设置参考 ID,则需要破解系统并通过 ADO.NET 进行设置。

    【讨论】:

    • 不不,EF可以处理ID。 与实体。如果两者都做,则称为外键关联
    • @GertArnold 好的。当然,从其他答案中,我看到您可以创建一个属性,该属性是实体引用的实际外键。但是,像这样使用它似乎仍然很笨拙。在我看来,检索您想要引用的实体并使用对该实体的引用来播种您的数据。直截了当,您的数据库被很好地抽象化了。
    【解决方案2】:

    要公开相关实体的 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() { }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      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},
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-13
        • 1970-01-01
        • 1970-01-01
        • 2022-07-20
        • 1970-01-01
        • 2014-03-29
        • 2022-01-09
        相关资源
        最近更新 更多