Asp.net mvc 实体框架列名Id无效(来自同一主表的两个外键)

Asp.net mvc 实体框架列名Id无效(来自同一主表的两个外键),asp.net-mvc,entity-framework,ef-code-first,Asp.net Mvc,Entity Framework,Ef Code First,我收到以下错误:无效的列名“Resource\u Id” 我尝试了我在这个论坛上找到的解决方案,但它并没有修复我的错误 以下是我的课程: public class Task { public int Id { get; set; } public string Name { get; set; } public int ApproverResourceId { get; set; } public int WorkingResourceId { get; se

我收到以下错误:无效的列名“Resource\u 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; }
}
我在CodeFirst类中添加了这个映射

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);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(t=>t.WorkingResource)
.有很多
.HasForeignKey(t=>t.WorkingResourceId)
.WillCascadeOnDelete(假);
modelBuilder.Entity()
.HasRequired(t=>t.ApproverResource)
.有很多
.HasForeignKey(t=>t.ApproverResourceId)
.WillCascadeOnDelete(假);
}

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

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; }
}
公共类资源
{
公共int Id{get;set;}
公共日期时间创建日期{get;set;}
公共日期时间更新日期{get;set;}
公共虚拟ICollection任务{get;set;}
公共虚拟ICollection工作任务{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");
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(t=>t.WorkingResource)
.有许多(r=>r.工作任务)
.HasForeignKey(t=>t.WorkingResourceId)
.WillCascadeOnDelete(假);
modelBuilder.Entity()
.HasRequired(t=>t.ApproverResource)
.WithMany(r=>r.ApproverTasks)
.HasForeignKey(t=>t.ApproverResourceId)
.WillCascadeOnDelete(假);
modelBuilder.Entity()
.ToTable(“外部资源”);
}

由于继承,您需要显式告诉ExternalResources的表名

我不知道它是如何为您工作的,但在我的例子中,我必须指定注释键+列顺序;在您的案例中,这两个属性都是“ResourceId”

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

公共类用户:EntityBase
{
[最小长度(5),最大长度(20),必填]
公共字符串登录{get;set;}
[最小长度(3),最大长度(50),必填]
公共字符串密码{get;set;}
公共虚拟列表SenderFriendRequests{get;set;}
公共虚拟列表ReceiverFriendRequests{get;set;}
}
公共类请求
{
[键,列(顺序=0)]
public int SenderId{get;set;}
[键,列(顺序=1)]
public int ReceiverId{get;set;}
公共虚拟用户发送方{get;set;}
公共虚拟用户接收器{get;set;}
[必需]
public FriendRequestStatus RequestStatus{get;set;}
}
如果我没有指定这些注释,EF将抛出一个DataException,并显示以下消息:

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


您能显示数据库的模式吗?它是由实体框架创建的吗?不幸的是,我不能添加图像(我需要10个声誉,我只有6个,因为我是新来的)。我将尝试描述我的数据库。我有3个表:1-任务(id、名称、审批人资源、工作资源);2-资源(Id、创建日期、更新日期);外部资源(Id、FirstName、LastName)。我有3个关系:Id(资源)-->ApproverResource(任务);Id(资源)-->WorkingResource(任务)和一个继承Id(资源)-->Id(外部资源)。您现在已经有足够的声誉了。此外,请尝试删除资源和外部资源之间的继承关系。还可以添加资源和外部资源之间的映射。好的,但是您能解释一下为什么删除继承更好吗?我这样做是因为我还将有一个内部资源类!谢谢你试着帮助我:)
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");
}
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; }
}