Entity framework 实体框架:显式设置主键值
是否可以设置您自己选择的主键值? 我正在处理来自API的数据,我希望这些对象在我的数据库中具有与最初相同的id 例如,我有一个具有以下属性的对象:Entity framework 实体框架:显式设置主键值,entity-framework,ef-code-first,Entity Framework,Ef Code First,是否可以设置您自己选择的主键值? 我正在处理来自API的数据,我希望这些对象在我的数据库中具有与最初相同的id 例如,我有一个具有以下属性的对象: _context = new ApplicationDbContext(); Object { id = 1234, Name = "Pitbull", Owner = "Greg" }; _context.saveChanges(Object); id是数据库中对象的主键。但是,如果我保存这个id,它将被丢弃,数据库将创建它自己的
_context = new ApplicationDbContext();
Object
{
id = 1234,
Name = "Pitbull",
Owner = "Greg"
};
_context.saveChanges(Object);
id是数据库中对象的主键。但是,如果我保存这个id,它将被丢弃,数据库将创建它自己的值
谢谢阅读!:) 是的
正确的方法是重写三个DbContext.SaveChanges
方法。在这些方法中,您将为所有添加对象的主键提供一个Id
在下面的示例中,这是在方法GenerateDS中完成的:
public override int SaveChanges()
{
GenerateIds();
return base.SaveChanges();
}
public override Task<int> SaveChangesAsync()
{
GenerateIds();
return await base.SaveChangesAsync();
}
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken)
{
GenerateIds();
return await base.SaveChangesAsync(cancellationToken);
}
private void GenerateIds()
{
var addedEntries = this.ChangeTracker.Entries()
.Where(e => e.State == EntityState.Added)
foreach (var addedEntry in addedEntries)
{
((IId)addedEntry.Entity).Id = this.CreateId();
}
}
确保数据库表中的
id
列不是identity,然后使用[DatabaseGenerated(DatabaseGeneratedOption.None)]取消创建id
属性
private static IdGen.IdGenerator idGenerator = new IdGen.IdGenerator(0);
private long CreatedId()
{
return idGenerator.CreateId();
}