【发布时间】:2020-03-03 17:41:41
【问题描述】:
所以我在实际保存之前尝试访问我的本地(或者您可以称之为“临时/运行时/RAM”)数据库(使用带有 EF Core 的 SQLite)它在硬盘上。发现我可以使用DbContext.MyTable.Local 访问本地myTable,但问题是尚未分配ID 的自动增量。那么我可以强制我的本地表成员在执行DbContext.SaveChanges() 之前自动分配ID 吗?如果没有,还有什么办法?
这是我的代码:
using System.Linq;
class Program
{
private static MyDbContext _myDbContext = new MyDbContext();
static void Main(string[] args)
{
MyClass newClass = new MyClass() { Name = "MyName", Amount = 10 };
_myDbContext.MyClasses.ToList(); // forcing to have all members in "_myDbContext.MyClasses.Local". Otherwise only changed/added etc. members appear.
_myDbContext.MyClasses.Add(newClass);
int myNewID = newClass.ID;
// I need newClass.ID that has been auto-assigned here, but it's currently integer default so myNewID value is 0
_myDbContext.SaveChanges();
int myNewerId = newClass.ID;
// now have new auto-assigned newClass.ID value but It's too late
}
}
我的模特:
class MyClass
{
public int ID { get; set; }
public string Name { get; set; }
public int Amount { get; set; }
}
我的 DbContext:
using Microsoft.EntityFrameworkCore;
class MyDbContext : DbContext
{
public DbSet<MyClass> MyClasses { get; set; }
private static bool _created = false;
public MyDbContext()
{
if (!_created)
{
_created = true;
//Database.EnsureDeleted();
Database.EnsureCreated();
}
}
protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder)
{
optionbuilder.UseSqlite(@"Data Source=..\TestDB.db");
}
}
【问题讨论】:
-
您能否详细说明您要完成的工作,以及为什么在保存记录后获取 ID 为时已晚?
-
我试图让用户操作他的本地数据库并仅通过“保存到数据库”按钮将更改保存到实际数据库中。
-
为时已晚,因为我在保存到实际数据库之前将值(包括 ID)放在本地数据库中
-
我不确定您的特定用例,但您应该能够创建一个界面,用户可以在其中操作对象列表,然后将其保存到数据库中完毕。我不确定为什么在将 ID 保存到数据库之前需要分配 ID。
标签: .net sqlite orm entity-framework-core rdbms