C# SqlClient.SqlException:对象名称无效
我在尝试保存更改时遇到此异常: System.Data.Entity.Infrastructure.DbUpdateException:发生错误 在更新条目时。有关详细信息,请参见内部异常 --->System.Data.Entity.Core.UpdateException:运行时出错 更新条目。有关详细信息,请参见内部异常 --->System.Data.SqlClient.SqlException:对象名称无效 “dbo.UserCacheModels” 我已经读过很多类似的问题,在大多数情况下,问题出现在不同步的DB模式和DbContext中。 但我认为我的情况不同,因为我没有这样的实体C# SqlClient.SqlException:对象名称无效,c#,entity-framework,exception,dbcontext,C#,Entity Framework,Exception,Dbcontext,我在尝试保存更改时遇到此异常: System.Data.Entity.Infrastructure.DbUpdateException:发生错误 在更新条目时。有关详细信息,请参见内部异常 --->System.Data.Entity.Core.UpdateException:运行时出错 更新条目。有关详细信息,请参见内部异常 --->System.Data.SqlClient.SqlException:对象名称无效 “dbo.UserCacheModels” 我已经读过很多类似的问题,在大多数
UserCacheModel
只是DTO类中的一个,它没有附加到DbContext,当然数据库中也没有这样的表
我的DbContext非常大,因此我将显示简化版本:
public class PhotoContext : DbContext
{
public PhotoContext(string connectionString)
: base(connectionString)
{
Database.SetInitializer<PhotoContext>(null);
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180;
}
#region DataSets
public IDbSet<VehicleLog> VehicleLogs { get; set; }
public IDbSet<ActivityMarker> ActivityMarkers { get; set; }
public IDbSet<Photo> Photos { get; set; }
//other datasets, but there is NO IDbSet<UserCacheModel> UserCacheModels
#endregion
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<VehicleLog>()
.Property(x => x.UserId)
.HasColumnName("User_Id");
modelBuilder.Entity<VehicleLog>()
.HasRequired(x => x.User)
.WithMany(x => x.VehicleLogs)
.HasForeignKey(x => x.UserId);
modelBuilder.Entity<Photo>()
.Property(x => x.WorkId)
.HasColumnName("Work_Id");
modelBuilder.Entity<Photo>()
.HasOptional(x => x.Work)
.WithMany(x => x.Photos)
.HasForeignKey(x => x.WorkId);
//other configuration
}
}
公共类PhotoContext:DbContext
{
公共PhotoContext(字符串连接字符串)
:基本(连接字符串)
{
Database.SetInitializer(null);
((IObjectContextAdapter)this).ObjectContext.CommandTimeout=180;
}
#区域数据集
公共IDbSet VehicleLogs{get;set;}
公共IDbSet活动标记程序{get;set;}
公共设置照片{get;set;}
//其他数据集,但没有IDbSet UserCacheModels
#端区
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Property(x=>x.UserId)
.HasColumnName(“用户Id”);
modelBuilder.Entity()
.HasRequired(x=>x.User)
.具有多个(x=>x.VehicleLogs)
.HasForeignKey(x=>x.UserId);
modelBuilder.Entity()
.Property(x=>x.WorkId)
.HasColumnName(“工作Id”);
modelBuilder.Entity()
.has可选(x=>x.Work)
.有很多(x=>x张照片)
.HasForeignKey(x=>x.WorkId);
//其他配置
}
}
有什么想法吗?请附上一份。至少包括您正在使用的
DbContext
实现(即您的代码)。UserCacheModel
是否在Photo
等实体中作为属性/关系引用?如何/在何处使用UserCacheModel
UserCacheModel?+1可能作为一个或多个实体中的属性引用。如果是,则将.Ignore(x=>x.UserCache)(假设UserCache是属性名)添加到可能有引用的任何实体中。不过最好删除引用并将其保留在viewmodels/DTO中,并保持实体的纯净。忽略属性可能会造成麻烦,因为它们会潜入Linq表达式,导致运行时失败。如果这是EF6,则可以通过多种方式将该类标识为“实体”(HavingDbSet
只是其中之一)。例如,您的UserCacheModel
是否源自UserCache
实体并位于同一程序集中?在这种情况下,EF6将发现它并自动将其映射为“实体”,您会感到非常惊讶。另一种方法是@StevePy@StevePy@Ivan Stoev提到的其他实体中的公共引用/集合属性。很抱歉,我刚刚发现我的一个实体包含两个UserCacheModel
类型的属性,但在DbContext中只有一个被忽略。所以我相信这就是原因。谢谢。如果您创建了一个答案,我将对其进行投票并将其标记为已接受。