如何使用ADO.NET Entity Framework Code First创建一对多关系?

时间:2012-01-13 14:38:02

标签: asp.net asp.net-mvc-3 entity-framework ef-code-first code-first

我正在努力解决一个问题,而且从我所看到的,所提出的解决方案都不起作用。

基本上我有两个班级:

public class Role
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class ActionType
{
    public int ID { get; set;}
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Role> AllowedRoles { get; set; }

    public ActionType()
    {
        this.AllowedRoles = new List<Role>();
    }  
}

我希望EF在DB中强制关联表,其中FK用于引用一对多关系。不知何故,代码首先为我的Role创建一个表,其中添加了一列ActionType_ID。当一个Role添加更多ActionType时,当然没用。正在播放DBUpdateExcpetion

有关如何解决这个问题的任何想法?关键是classe Role没有引用ActionType,因为这没用。

谢谢!

1 个答案:

答案 0 :(得分:1)

你真的想做什么?目前,您可以向单个Role添加更多ActionType个,但单个Role无法添加到多个ActionType。你也想要吗?

在这种情况下,您不会进行一对多关联,而是多对多关联。只有多对多关系才使用联结(关联)表。一对多关系确实意味着依赖实体(多方面的实体)对主体实体具有FK。最简单的方法是在Role中定义导航属性:

public class Role
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<ActionType> ActionTypes { get; set; } 
}

public class ActionType
{
    public int ID { get; set;}
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Role> AllowedRoles { get; set; } 
}

如果您不想在Role中拥有导航属性,则必须使用流畅的API来描述关系。

public class Context : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ActionType>()
                    .HasMany(a => a.AllowedRoles)
                    .WithMany();
    }
}