entity framework 列名 ID 无效(来自同一主 table 的两个外键)

entity framework Invalid column name Id (two foreign keys from the same primary table)

我收到此错误:列名称无效 'Resource_Id'

我尝试了我在这个论坛上找到的解决方案,但没有解决我的错误。

这是我的 类:

public class Task 
{
    public int Id { get; set; }

    public string Name { get; set; }
    public int ApproverResourceId { get; set; }
    public int WorkingResourceId { get; set; }

    public virtual Resource ApproverResource { get; set; }
    public virtual Resource WorkingResource { get; set; }
}

资源Class

public class Resource
{
    public int Id { get; set; }

    public DateTime CreationDate { get; set; }
    public DateTime UpdateDate { get; set; }

    public virtual ICollection<Task> Tasks { get; set; }
}

外部资源

public class ExternalResource : Resource
{
    //public int Id { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

我在我的 CodeFirst 中添加了这个映射 Class

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Task>()
        .HasRequired(t => t.WorkingResource)
        .WithMany()
        .HasForeignKey(t => t.WorkingResourceId)
        .WillCascadeOnDelete(false);

    modelBuilder.Entity<Task>()
        .HasRequired(t => t.ApproverResource)
        .WithMany()
        .HasForeignKey(t => t.ApproverResourceId)
        .WillCascadeOnDelete(false);
}

您需要 2 个导航属性,因为您有 2 个外键:

public class Resource
{
    public int Id { get; set; }

    public DateTime CreationDate { get; set; }
    public DateTime UpdateDate { get; set; }

    public virtual ICollection<Task> ApproverTasks { get; set; }
    public virtual ICollection<Task> WorkingTasks { get; set; }
}

在 DbContext 中,您在 WithMany 中指定它们:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Task>()
        .HasRequired(t => t.WorkingResource)
        .WithMany(r => r.WorkingTasks)
        .HasForeignKey(t => t.WorkingResourceId)
        .WillCascadeOnDelete(false);

    modelBuilder.Entity<Task>()
        .HasRequired(t => t.ApproverResource)
        .WithMany(r => r.ApproverTasks)
        .HasForeignKey(t => t.ApproverResourceId)
        .WillCascadeOnDelete(false);

    modelBuilder.Entity<ExternalResource>()
        .ToTable("ExternalResources");
}

由于 Table-Per-Type 继承,您需要明确告诉 table ExternalResources 的名称。

我不知道它是如何为您工作的,但就我而言,我必须指定注释键 + 列顺序;在你的情况下,这两个属性 "ResourceId".

我有完全相同的表配置,没有第三个 "External"。

Public class User : EntityBase
{
    [MinLength(5), MaxLength(20), Required]
    public string Login { get; set; }
    [MinLength(3), MaxLength(50),Required]
    public string Password { get; set; }
    public virtual List<FriendRequest> SenderFriendRequests { get; set; }
    public virtual List<FriendRequest> ReceiverFriendRequests { get; set; }
}

public class FriendRequest 
{
    [Key, Column(Order=0)]
    public int SenderId { get; set; }
    [Key, Column(Order=1)]
    public int ReceiverId { get; set; }
    public virtual User Sender { get; set; }
    public virtual User Receiver { get; set; }

    [Required]
    public FriendRequestStatus RequestStatus { get; set; }
}

如果我不指定这些注释,EF 会向我抛出一个 DataException 消息:

One or more validation errors were detected during model generation: Server.DAL.Context.FriendRequest: : EntityType 'FriendRequest' has no key defined. Define the key for this EntityType. FriendRequests: EntityType: EntitySet 'FriendRequests' is based on type 'FriendRequest' that has no keys defined.