我有一個問題,1.1這個查詢實體框架的核心:包括原因InvalidCastException的
包括對LeaveType提出這個錯誤:
InvalidCastException: Unable to cast object of type 'System.DateTime' to type 'System.Int32'.
Microsoft.EntityFrameworkCore.ChangeTracking.Internal.SimpleNonNullableDependentKeyValueFactory.TryCreateFromBuffer(Valu fdc eBuffer valueBuffer, out TKey key)
我的模型:
public class Proposal
{
[Key]
public int ProposalId { get; set; }
[Required]
public DateTime DateCreated { get; set; }
[Required]
public int CreatorId { get; set; }
[ForeignKey("CreatorId")]
public Employee Creator { get; set; }
}
public class ProposalLeave : Proposal
{
[Required]
public DateTime LeaveStart { get; set; }
[Required]
public DateTime LeaveEnd { get; set; }
[Required]
public int ProposalLeaveTypeId { get; set; }
[ForeignKey("ProposalLeaveTypeId")]
public virtual ProposalLeaveType LeaveType { get; set; }
public virtual ICollection<ProposalLeaveStatuses> ProposalLeaveStatuses { get; set; }
}
public class ProposalLeaveType
{
[Key]
public int LeaveTypeId { get; set; }
[Required, StringLength(255)]
public string Name { get; set; }
[Required, Column(TypeName = "text")]
public string Description { get; set; }
public ICollection<ProposalLeave> ProposalLeaves { get; set; }
}
我的DbContext的一部分:
public class AppDbContext : IdentityDbContext<User, Role, int>
{
public DbSet<Proposal> Proposal { get; set; }
public DbSet<ProposalLeaveStatus> ProposalLeaveStatus { get; set; }
public DbSet<ProposalLeaveStatuses> ProposalLeaveStatuses { get; set; }
public DbSet<ProposalLeaveType> ProposalLeaveType { get; set; }
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// proposal hierarchy
modelBuilder.Entity<Proposal>()
.HasDiscriminator<string>("proposal_type")
.HasValue<Proposal>("proposal_base")
.HasValue<ProposalCustom>("proposal_custom")
.HasValue<ProposalLeave>("proposal_leave");
// proposal statuses many to many
modelBuilder.Entity<ProposalLeaveStatuses>()
.HasOne(pt => pt.Proposal)
.WithMany(p => p.ProposalLeaveStatuses)
.HasForeignKey(pt => pt.ProposalId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<ProposalLeaveStatuses>()
.HasOne(pt => pt.ProposalLeaveStatus)
.WithMany(t => t.ProposalLeaveStatuses)
.HasForeignKey(pt => pt.ProposalLeaveStatusId);
//Substantially, there are nothing about Proposal Leave Types, cause its relation one-to-many modeled using data annotations.
}
}
我檢查了這些模型數百次,我不知道什麼是錯的。這很奇怪casuse我也有ProposalCustom:以同樣的方式作爲ProposalLeave與ProposalCustomType contected議案模型:提案ProposalLeaveType並能正常工作......
我發現,如果我再補充一點行:
var leaveTypes = _context.ProposalLeaveType.Include(plt => plt.ProposalLeaves).ToList();
我查詢之前,它甚至還帶有.Include(l=>l.LeaveType)
沒有任何異常的作品...
我發現EF github上指InvalidCastException的幾個錯誤的問題,但所有的人都被標記爲固定EF核心1.1
@Update 在這裏,您可以下載VS2015項目,重現該問題: Project。 安裝程序:
- 安裝.Net Core 1.1。 SDK和Runtime
- 創建空數據庫和程序包管理器控制檯appsettings.json更換連接字符串
- 運行更新,數據庫
- 運行項目。
沒有完整的模型不能重現。如果你註釋掉'.Include(l => l.ProposalLeaveStatuses),那麼會發生什麼。ThenInclude(l => l.ProposalLeaveStatus)'line? –
@IvanStoev它仍然不起作用。只刪除該行:'Include(l => l.LeaveType)'修復了我的問題。這就是爲什麼我跳過我的問題中的ProposalLeaveStatuses和ProposalLeaveStatus模型的定義。稍後我會通過添加DbContext – Kuba
的重要部分來更新我的問題。但是看起來像這樣會影響這個過程,因爲沒有'.ThenInclude(e => e.User)'和第一個註釋中提到的行它不會發生,我的意思是它沒有錯誤。 –