C# EF-外键关系中复合键的一部分
我正试图利用ADO.NET的“数据库代码优先”功能。这一代人工作顺利,输出了我想要的所有模型。我有几个EF模型,它们都有复合键作为主键。下面我举了两个这样的模型作为例子C# EF-外键关系中复合键的一部分,c#,sql,entity-framework,C#,Sql,Entity Framework,我正试图利用ADO.NET的“数据库代码优先”功能。这一代人工作顺利,输出了我想要的所有模型。我有几个EF模型,它们都有复合键作为主键。下面我举了两个这样的模型作为例子 public partial class LabRole { public LabRole() { LabRolePermissions = new HashSet<LabRolePermission>(); LabUserRoles = new HashSet<
public partial class LabRole
{
public LabRole()
{
LabRolePermissions = new HashSet<LabRolePermission>();
LabUserRoles = new HashSet<LabUserRole>();
RoleSubscriptions = new HashSet<RoleSubscription>();
}
[Key]
[Column(Order = 0)]
[StringLength(50)]
public string RoleID { get; set; }
[Key]
[Column(Order = 1)]
[StringLength(50)]
public string LabID { get; set; }
public virtual ICollection<LabRolePermission> LabRolePermissions { get; set; }
public virtual Lab Lab { get; set; }
public virtual ICollection<LabUserRole> LabUserRoles { get; set; }
public virtual ICollection<RoleSubscription> RoleSubscriptions { get; set; }
}
然后在其上设置外键关系:
modelBuilder.Entity<LabRole>()
.HasMany(e => e.LabRolePermissions)
.WithRequired(e => e.LabRole)
.HasForeignKey(e => new { e.RoleID, e.LabID })
.WillCascadeOnDelete(false);
有人能解释一下为什么会发生这种情况和/或这个问题的解决方案吗。好的,我找到了答案。如果我不再使用数据注释来指定键,而是使用fluent-API来指定它们,那么生成的数据库将按预期运行 例如,如果我将模型更改为:
public partial class LabRole
{
public LabRole()
{
LabRolePermissions = new HashSet<LabRolePermission>();
LabUserRoles = new HashSet<LabUserRole>();
RoleSubscriptions = new HashSet<RoleSubscription>();
}
[StringLength(50)]
public string RoleID { get; set; }
[StringLength(50)]
public string LabID { get; set; }
public virtual ICollection<LabRolePermission> LabRolePermissions { get; set; }
public virtual Lab Lab { get; set; }
public virtual ICollection<LabUserRole> LabUserRoles { get; set; }
public virtual ICollection<RoleSubscription> RoleSubscriptions { get; set; }
}
然后使用Fluent定义关键点,即
modelBuilder.Entity<LabRolePermission>().HasKey(e => new { e.LabID, e.RoleID, e.PermissionID });
modelBuilder.Entity<LabRole>().HasKey(e => new { e.RoleID, e.LabID });
modelBuilder.Entity().HasKey(e=>new{e.LabID,e.RoleID,e.PermissionID});
modelBuilder.Entity().HasKey(e=>new{e.RoleID,e.LabID});
我可以访问数据库,没有任何问题。我真的不知道为什么会这样,但确实如此。希望这对将来的人有所帮助。好的,我找到了答案。如果我不再使用数据注释来指定键,而是使用fluent-API来指定它们,那么生成的数据库将按预期运行 例如,如果我将模型更改为:
public partial class LabRole
{
public LabRole()
{
LabRolePermissions = new HashSet<LabRolePermission>();
LabUserRoles = new HashSet<LabUserRole>();
RoleSubscriptions = new HashSet<RoleSubscription>();
}
[StringLength(50)]
public string RoleID { get; set; }
[StringLength(50)]
public string LabID { get; set; }
public virtual ICollection<LabRolePermission> LabRolePermissions { get; set; }
public virtual Lab Lab { get; set; }
public virtual ICollection<LabUserRole> LabUserRoles { get; set; }
public virtual ICollection<RoleSubscription> RoleSubscriptions { get; set; }
}
然后使用Fluent定义关键点,即
modelBuilder.Entity<LabRolePermission>().HasKey(e => new { e.LabID, e.RoleID, e.PermissionID });
modelBuilder.Entity<LabRole>().HasKey(e => new { e.RoleID, e.LabID });
modelBuilder.Entity().HasKey(e=>new{e.LabID,e.RoleID,e.PermissionID});
modelBuilder.Entity().HasKey(e=>new{e.RoleID,e.LabID});
我可以访问数据库,没有任何问题。我真的不知道为什么会这样,但确实如此。希望这对将来的人有所帮助。为什么您需要LabRolePermission的主键来包含复合外键?我不需要,但这是遗留数据库中的设计。如果可能的话,我希望尽量避免更改架构。什么版本的.NET?oooh代码首先来自现有数据库,在添加迁移之前它是否正常工作?为什么需要LabRolePermission的主键来包含复合外键?我不必这样做,但这是遗留数据库中的设计。如果可能的话,我希望尽量避免更改架构。什么版本的.NET?oooh代码首先来自现有数据库,在添加迁移之前它是否正常工作?为什么需要LabRolePermission的主键来包含复合外键?我不必这样做,但这是遗留数据库中的设计。如果可能的话,我希望尽量避免更改模式。什么版本的.NET?oooh代码首先来自现有数据库,在添加迁移之前它是否正常工作?
modelBuilder.Entity<LabRolePermission>().HasKey(e => new { e.LabID, e.RoleID, e.PermissionID });
modelBuilder.Entity<LabRole>().HasKey(e => new { e.RoleID, e.LabID });