Asp.net mvc 实体框架列名Id无效(来自同一主表的两个外键)
我收到以下错误:无效的列名“Resource\u 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
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; }
}