2

我正在努力解决一个问题,并从我所见过的解决方案中找不到任何解决方案。如何使用ADO.NET实体框架代码优先创建一对多关系?

基本上我有两类:

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

有关我该如何解决这个问题的任何想法?问题在于类角色没有引用ActionType,因为这没有用。

谢谢!

回答

1

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

在这种情况下,您并没有进行一对多的关联,而是进行多对多的关联。只有多对多关系使用联结(关联)表。一对多关系实际上意味着依赖实体(多方关系实体)将FK作为主体。最简单的方法是在角色定义导航属性,以及:

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

如果你不希望有导航属性的角色,你必须使用流畅API来描述的关系。

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

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

谢谢你,最后提出的方案就像一个魅力。似乎我不得不在这个流利的API中潜水。 – cecemel 2012-01-13 17:10:38

相关问题