Code First生成数据库奇怪的行为

时间:2014-05-03 00:00:28

标签: c# entity-framework ef-code-first code-first

我有两个实体PermissionPermissionDependency,每个Permission有很多PermissionDependency

例如" Permission1"取决于" Permission2"用户无法获得" Permission1"没有" Permission2"。

以下是两个代码:

Permission

    [Key]
    public int Id { get; set; }

    [Required, StringLength(150)]
    public string Title { get; set; }

    public virtual List<PermissionDependency> Dependencies { get; set; }

PermissionDependency

    [Key, Column(Order = 0), ForeignKey("Permission")]
    public int PermissionId { get; set; }

    [Key, Column(Order = 1), ForeignKey("Parent")]
    public int ParentId { get; set; }

    [DefaultValue(true)]
    public bool IsRequired { get; set; }

    public virtual Permission Permission { get; set; }

    public virtual Permission Parent { get; set; }

问题:

我希望表PermissionDependency有2个外键PermissionIdParentId以及IsRequired,但Generated表中有一个名为Permission_Id的额外列是Permission属性的外键id。

修改PermissionDependency PermissionIdParentId中必须有key注释,因为它们是&#34;复合键&#34;

这是生成的表:

PermissionDependency

为什么Code首先要将Permission_Id创建为Nullable列?

这段代码产生这种奇怪的行为有什么问题?


EDIT2:

我希望在权限之间实现父子关系,每个权限可能有多个父,如何实现这个逻辑?

3 个答案:

答案 0 :(得分:0)

我很确定如果您使用以下代码,它应该生成正确的密钥和外键:

public class Permission
{
    public int PermissionId { get; set; }

    [Required, StringLength(150)]
    public string Title { get; set; }

    public virtual List<PermissionDependency> Dependencies { get; set; }
}

public class PermissionDependency
{
    public int PermissionDependencyId { get; set; }

    [DefaultValue(true)]
    public bool IsRequired { get; set; }
} 

答案 1 :(得分:0)

在正常情况下,如果您将表名用作字段名称,则不希望指定外键Annotation,EF将自动知道这是相关表的外键。还有Key anotation也无需添加因为功能相同

所以你必须这样做。

权限类

[Key]
public int Id { get; set; }

[Required, StringLength(150)]
public string Title { get; set; }

public virtual List<PermissionDependency> Dependencies { get; set; }

在权限依赖类

public int PermissionId { get; set; }

public int ParentId { get; set; }

[DefaultValue(true)]
public bool IsRequired { get; set; }

public virtual Permission Permission { get; set; }

这将自动为您完成。如果成功发表评论。

答案 2 :(得分:0)

对于OP来说可能会迟到但是我遇到了类似的问题,我在DbContext中覆盖了OnModelCreating方法。

在你的情况下,我认为类似下面的内容可以解决问题:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   base.OnModelCreating(modelBuilder);

   modelBuilder.Entity<PermissionDependency>()
               .HasRequired(d => d.Permission)
               .WithMany(o => o.Dependencies);
}

我在阅读this article之后找到了这个解决方案。