[英]C# EntityFramework Core - Invalid object name, cannot update database
创建的简单模型:
public class MarketTickContext : DbContext { public DbSet<MarketTickRecord> Records { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { string connectionString = @"Data Source = (LocalDB)\\MSSQLLocalDB; AttachDbFilename = ""C:\\Users\\asmodat\\Documents\\Visual Studio 2015\\Projects\\Asmodat FxTrader\\Asmodat FxTrader Data\\FxTrader.mdf""; Integrated Security = True"; optionsBuilder.UseSqlServer(connectionString); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MarketTickRecord>() .HasKey(mtr => new { mtr.Company, mtr.Symbol }); modelBuilder.Entity<MarketTickRecord>() .HasMany(mtr => mtr.Ticks); modelBuilder.Entity<MarketTick>() .HasKey(mt => mt.Time); } }
在控制台中运行:Add-Migration MarketTickMigration.v3->成功
但首先。 此操作后的数据库看起来不像我预期的那样。 我认为应该有2个表:MarketTickRecord和MarketTick表
因此,当我运行此代码时:
_context = new MarketTickContext();
_context.Records.Add(new MarketTickRecord());
_context.SaveChanges();
最后一行生成异常:
An unhandled exception of type 'Microsoft.EntityFrameworkCore.DbUpdateException' occurred in Microsoft.EntityFrameworkCore.dll
Additional information: An error occurred while updating the entries. See the inner exception for details.
{"Invalid object name 'Records'."}
如果我尝试也一样:
_context.Records.Count()
有人能指出我在做什么吗? 如何更新数据库使其正常工作?
编辑#############################->进度
我正在慢慢弄清楚发生了什么,因此我创建了最简单的模型来逐步检查问题所在。
public class TestContext : DbContext
{
public DbSet<TestRecord> Tests { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Asmodat_FxTrader_Data.MarketTicksDb.v14;Trusted_Connection=True;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TestRecord>()
.HasKey(c => new { c.SomeK1, c.SomeK2 });
}
}
上面的模型效果很好。 因此,在创建新的“ Test”类后会出现问题,该类将放置在TestRecord类的列表中,例如:
public class TestRecord
{
public string SomeK1 { get; set; }
public string SomeK2 { get; set; }
public List<Test> Tests { get; set; }
}
public class Test
{
public long SomeK1 { get; set; }
public int V1 { get; set; }
public int V2 { get; set; }
}
如果现在将OnModelCreating更新为:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TestRecord>()
.HasKey(c => new { c.SomeK1, c.SomeK2 });
modelBuilder.Entity<Test>()
.HasKey(c => c.SomeK1);
}
出现与原始问题相同的例外。
所以问题就在这里,与这个List对象或OnModelCreating中缺少的东西有关。 有任何想法吗 ?
编辑########################################
正如评论中所建议的,我也尝试过这样做:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var tr = modelBuilder.Entity<TestRecord>();
tr.HasKey(c => new { c.SomeK1, c.SomeK2 });
tr.HasMany(c => c.Tests);
tr.ToTable("Records");
var t = modelBuilder.Entity<Test>();
t.HasKey(c => c.SomeK1);
t.ToTable("Tests");
}
仍然存在相同的问题,只是在执行过程中名称发生错误更改
TestContext con = new TestContext();
con.Tests.Add(new TestRecord() { SomeK1 = "a1", SomeK2 = "a2", Tests = new List<Test>() });
con.SaveChanges();
编辑########################################
我需要的是要有许多TestRecord,可以在其中存储许多测试(以一对多)。
但是还需要的是,比如说SomeRecord = {'a','b'}的TestRecord和SomeK = {'c','d'}的TestRecord可能具有相同ID的Test,但是一个不同的对象(例如,不同的V1和V2)。
例如(伪代码):
TestRecord['a','b'].Tests[1].v1 == 1
TestRecord['c','d'].Tests[1].v1 == 2
可能吗 ? 有谁知道如何使用ef core flex API实现这一目标? 因为我所有的尝试都失败了。
我目前在学校项目中使用实体框架,而Ive发生了很多奇怪的事情,所以我感到您的痛苦。 我不确定您的MarketTickRecord或MarketTick的类到底是什么样子,但是我的教授让我们添加到数据库对象中的一件事是“ public class ...”行上方的数据注释[Table("YOUR_TABLE_NAME)"]
并在类中位于属性上方的[Key]
作为主键。 另外,我们使用Visual Studio中的数据库设计器手动创建了表。 不确定这是否对您有帮助,但值得一试!
对于后代的解决方案,请勿使用现有数据库-必须由ef核心本身从头开始创建,否则它将在保存等情况下引发异常。
public class TestContext : DbContext
{
public DbSet<Test> Tests { get; set; }
public DbSet<TestRecord> TestRecords { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string connectionString = @"Server=(localdb)\mssqllocaldb;Database=Asmodat_FxTrader_Data.TestDb.v1;Trusted_Connection=True;";
optionsBuilder.UseSqlServer(connectionString);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var tr = modelBuilder.Entity<TestRecord>();
tr.HasMany(p => p.Tests).WithOne(x => x.TestRecord).HasForeignKey(p => p.TestRecordId);
}
}
[Table("TestRecords")]
public class TestRecord
{
public TestRecord()
{
this.Tests = new List<Test>();
}
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TestRecordId { get; set; }
public string SomeK1 { get; set; }
public string SomeK2 { get; set; }
public virtual ICollection<Test> Tests { get; set; }
}
[Table("Tests")]
public class Test
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TestId { get; set; }
public int TestRecordId { get; set; }
public virtual TestRecord TestRecord { get; set; }
public long VT { get; set; }
public int V1 { get; set; }
public int V2 { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.