我有两个实体Permission
和PermissionDependency
,每个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个外键PermissionId
和ParentId
以及IsRequired
,但Generated表中有一个名为Permission_Id
的额外列是Permission
属性的外键id。
修改
在PermissionDependency
PermissionId
和ParentId
中必须有key
注释,因为它们是&#34;复合键&#34;
这是生成的表:
为什么Code首先要将Permission_Id
创建为Nullable列?
这段代码产生这种奇怪的行为有什么问题?
EDIT2:
我希望在权限之间实现父子关系,每个权限可能有多个父,如何实现这个逻辑?答案 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之后找到了这个解决方案。