MVC模型构建:表中有多个外键,代码首先是EF

时间:2014-10-07 06:38:30

标签: c# entity-framework asp.net-mvc-4 ef-code-first foreign-keys

我正在围绕游戏构建一个应用程序,并且我在游戏对象中保留了两种类型的动作列表:

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)
...

我遇到的问题是当我查看创建的数据库时。 &#39;行动&#39; table具有我期望的所有常规变量,但对于游戏对象引用,它显示以下列:

  • Game_Id
  • Game_Id1
  • Game_Id2

我猜我应该在DbContext中覆盖模型构建器时做一些事情,以确保只有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);
    }

基于此处的帖子(Entity Framework 4.1 InverseProperty Attribute and ForeignKey),但现在我又收到了其他错误:

外键组件&#39; Game&#39;不是类型&#39; Action&#39;的声明属性。验证它是否未从模型中明确排除,并且它是有效的原始属性。

我不知道如何解决这个问题,因为我希望我在模型制作工具中使用上面错误的配置,所以我希望有人能指出我:)

1 个答案:

答案 0 :(得分:1)

经过一些研究后,我发现根本不可能在一个对象中有多个列表引用填充列表的对象类型中的单个键。处理此问题的方法是使用DataAnnotation&#39; InverseProperty&#39;如下所示: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)
}

不幸的是,这也意味着我将拥有一个几乎总是为null的列(PassiveActions比ActiveActions更少),但我想这就是它的工作方式。对于两个以上的列表,我认为更好地更改架构或其他内容并使用子类来避免获取列的负载以简单地跟踪项目所在的列表。

如果某人找到了将Action表中的1列作为游戏链接的方法以及另一种跟踪这两个列表的方法,请回复:)