【问题标题】:entity framework Invalid column name Id (two foreign keys from the same primary table)实体框架无效的列名Id(来自同一个主表的两个外键)
【发布时间】:2015-06-26 19:59:01
【问题描述】:

我收到此错误:列名“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; }
}

资源类

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

【问题讨论】:

  • 你能显示你的数据库的架构吗?是实体框架创建的吗?
  • 不幸的是,我无法添加图像(我需要 10 个声誉,而我只有 6 个,因为我是新来的)。我将尝试描述我的数据库。我有 3 个表:1-Tasks(id、Name、ApproverResource、WorkingResource); 2-资源(Id、creationDate、UpdateDate);外部资源(Id、FirstName、LastName)。我有 3 个关系: Id (Resources) -->ApproverResource(Tasks) ; Id(Resources)-->WorkingResource(Tasks) AND 一个继承 Id(Resources) --> Id (ExternalResources)。
  • 你的声望已经够多了。此外,请尝试删除 Resources 和 ExternalResources 之间的继承。还要添加 Resources 和 ExternalResources 之间的映射。
  • 好的,但你能解释一下为什么最好删除继承吗?我这样做是因为我还将有一个内部资源类!
  • 感谢您帮助我 :)

标签: asp.net-mvc entity-framework ef-code-first


【解决方案1】:

您需要 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 继承,您需要显式告知 ExternalResources 的表名。

【讨论】:

    【解决方案2】:

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

    我有完全相同的表配置,没有第三个“外部”。

    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:

    在模型生成过程中检测到一个或多个验证错误: Server.DAL.Context.FriendRequest: : EntityType 'FriendRequest' 没有定义键。定义此 EntityType 的键。 FriendRequests: EntityType: EntitySet 'FriendRequests' 基于没有定义键的类型'FriendRequest'。

    【讨论】:

      猜你喜欢
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多