MVC建模:表中有多个外键,代码先行EF
本文关键字:代码 EF 建模 MVC | 更新日期: 2023-09-27 18:25:43
我正在围绕游戏构建一个应用程序,并在我的游戏对象中列出了两种类型的操作:
public class Game
{
public int Id {get;set;}
List<Action> ActiveActionList {get;set}
List<Action> PassiveActionList {get;set;}
... (several other variables)
}
public class Action
{
public int Id {get;set;}
Game Game {get;set;}
...(several other variables)
}
这里的想法是,一个动作要么在被动动作列表中,要么在主动动作列表中(从来没有同时在两者中),我也在动作的一边放了一个参考,这样在处理一个动作时,我可以说这样的话:
if (currentAction.Game.Id == someVariable)
...
我遇到的问题是当我查看创建的数据库时。"Actions"表包含了我所期望的所有正常变量,但对于游戏对象引用,它显示了以下列:
- 游戏Id
- 游戏_Id1
- 游戏_Id2
我想我应该在DbContext中重写modelbuilder,以确保只有1列引用Game_Id。
我尝试使用:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Actie>().HasRequired<Spel>(s => s.Spel).WithMany(a => a.Actielijst).HasForeignKey(a => a.Spel).WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
基于这里的帖子(实体框架4.1 InverseProperty属性和ForeignKey),但现在我得到了另一个错误:
外键组件"Game"不是类型"Action"的已声明属性。请确认它没有从模型中明确排除,并且它是有效的基元属性。
我不知道如何解决这个问题,因为我只是在建模器中使用了错误的配置,所以我希望这里有人能正确地指出:)
经过更多的研究,我发现在一个对象中有多个列表引用填充列表的对象类型中的单个键是不可能的。处理此问题的方法是使用DataAnnotation"InverseProperty",如下所示:https://stackoverflow.com/a/25366822/3191144
这意味着需要为要保留的每个列表都有一个引用对象。对于我的情况,我必须做以下事情:
public class Game
{
public int Id {get;set;}
[InverseProperty("Game")]
List<Action> ActiveActionList {get;set;}
[InverseProperty("PassiveGame")]
List<Action> PassiveActionList {get;set;}
... (several other variables)
}
public class Action
{
public int Id {get;set;}
Game Game {get;set;}
Game PassiveGame {get;set;}
...(several other variables)
}
不幸的是,这也意味着我将有一列几乎总是空的(PassiveActions比ActiveActions更罕见),但我想这就是它的工作方式。对于两个以上的列表,我认为最好更改架构或其他东西,并使用子类来避免加载列,从而简单地跟踪项目在哪个列表中。
如果有人想办法在动作表中有一列作为游戏链接,并用另一种方法跟踪这两个列表,请回复:)