我遵循了Adam的回答here,现在实体框架正常运作,Seed()
方法也有效。
但是当我尝试像这样访问数据库时:
public User FindUserByID(int id)
{
return (from item in this.Users
where item.ID == id
select item).SingleOrDefault();
}
.............................................................................
// GET: /Main/
public ActionResult Index(int? id)
{
var db = UserDataBaseDB.Create();
if (!id.HasValue)
id = 0;
return View(db.FindUserByID(id.Value));
}
它在return (from item in this.Users
处抛出异常,说明:
Exception Details: System.Data.SqlClient.SqlException: Invalid object name 'dbo.BaseCs'.
我已尝试将其替换为:
return this.Users.ElementAt(id);
然后它会抛出此异常。
LINQ to Entities does not recognize the method 'MySiteCreator.Models.User ElementAt[User](System.Linq.IQueryable
1 [MySiteCreator.Models.User],Int32)'方法,此方法无法转换为商店表达式。
任何人都可以帮助我吗? 谢谢!
答案 0 :(得分:56)
异常详细信息:System.Data.SqlClient.SqlException:无效的对象名称'dbo.BaseCs'
此错误意味着EF正在将您的LINQ转换为使用名为dbo.BaseCs
的对象(很可能是表)的sql语句,该对象在数据库中不存在。
检查数据库并验证该表是否存在,或者您应该使用其他表名。此外,如果您可以发布您正在关注的教程的链接,那将有助于跟进您正在做的事情。
答案 1 :(得分:17)
很可能是'adrift'所提到的模型类名和表名之间的不匹配。如果您希望保持模型类名与表名(我为OAuthMembership所做的)不同,请使它们相同或使用下面的示例。请注意,模型类名称为OAuthMembership,而表名称为webpages_OAuthMembership。
为模型提供表属性:
[Table("webpages_OAuthMembership")]
public class OAuthMembership
通过重写DBContext OnModelCreating:
来提供映射class webpages_OAuthMembershipEntities : DbContext
{
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
var config = modelBuilder.Entity<OAuthMembership>();
config.ToTable( "webpages_OAuthMembership" );
}
public DbSet<OAuthMembership> OAuthMemberships { get; set; }
}
答案 2 :(得分:11)
如果你提供这样的映射:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ClassificationMap());
modelBuilder.Configurations.Add(new CompanyMap());
modelBuilder.Configurations.Add(new GroupMap());
....
}
请记住为BaseCs添加地图。
如果丢失,您将不会收到编译错误。但是当您使用实体时,您将收到运行时错误。
答案 3 :(得分:6)
EF正在寻找一个名为dbo.BaseCs的表。可能是实体名称多元化问题。看看这个link。
编辑:更新了链接。
答案 4 :(得分:6)
关于表名的多元化,这可能是一个问题。您可以使用下面的代码段关闭此约定。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
答案 5 :(得分:2)
如果一切正常,ConnectionString
检查db上下文文件中的DbSet集合名称。如果该名称和数据库表名称不匹配,您也会收到此错误。
因此,例如, 类别,产品
public class ProductContext : DbContext
{
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
}
应与实际的数据库表名匹配:
答案 6 :(得分:1)
您必须在两个不同的位置定义架构和表。
上下文定义了架构
public class BContext : DbContext
{
public BContext(DbContextOptions<BContext> options) : base(options)
{
}
public DbSet<PriorityOverride> PriorityOverrides { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.HasDefaultSchema("My.Schema");
builder.ApplyConfiguration(new OverrideConfiguration());
}
}
和每个表
class PriorityOverrideConfiguration : IEntityTypeConfiguration<PriorityOverride>
{
public void Configure(EntityTypeBuilder<PriorityOverride> builder)
{
builder.ToTable("PriorityOverrides");
...
}
}
答案 7 :(得分:1)
我不知道是不是
如果在添加DbSet之前创建迁移,则您的sql表将具有模型名称,通常以单数形式或按照惯例,我们使用复数形式命名DbSet。
因此,请尝试验证您的DbSet名称是否与表相同。如果不是,请尝试更改配置。
答案 8 :(得分:1)
很可能翻译后的 SQL 语句找不到表名。
就我而言,该表已分配给不同的架构。因此,在模型中,您应该像这样输入表的模式定义:
[Table("TableName", Schema = "SchemaName")]
public class TableName
{
}
答案 9 :(得分:0)
而不是
modelBuilder.Entity<BaseCs>().ToTable("dbo.BaseCs");
尝试:
modelBuilder.Entity<BaseCs>().ToTable("BaseCs");
即使您的表格名称为dbo.BaseCs
答案 10 :(得分:0)
对于它的价值,我想提到的是,问题出在AFTER INSERT触发器上!
这些不是超级可见,因此您可能需要搜索一段时间!
答案 11 :(得分:0)
我的修复非常简单,只需确保所有appsettings.json文件中都有正确的连接字符串,而不仅仅是默认的字符串即可。
答案 12 :(得分:0)
在 EF (Core) 配置(数据注解和 fluent API)中,表名与架构分开。
删除“dbo”。从表名并使用带有名称和架构参数的 ToTable 重载:
.ToTable("MyUsers", "dbo");
或者考虑到 dbo 是默认架构(如果没有以不同方式配置),只需:
.ToTable("MyUsers");
就目前而言,它认为表 dbo.dbo.MyUsers 当然不存在。
答案 13 :(得分:0)
当我查看正在测试的项目的配置时,我的测试中的数据库配置错误。
答案 14 :(得分:-2)
在上下文定义中,每个上下文类只定义两个DbSet上下文。