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.
我收到此错误:列名称无效 '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.