Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF-外键关系中复合键的一部分_C#_Sql_Entity Framework - Fatal编程技术网

C# 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<

我正试图利用ADO.NET的“数据库代码优先”功能。这一代人工作顺利,输出了我想要的所有模型。我有几个EF模型,它们都有复合键作为主键。下面我举了两个这样的模型作为例子

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