Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架:显式设置主键值_Entity Framework_Ef Code First - Fatal编程技术网

Entity framework 实体框架:显式设置主键值

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,它将被丢弃,数据库将创建它自己的

是否可以设置您自己选择的主键值? 我正在处理来自API的数据,我希望这些对象在我的数据库中具有与最初相同的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();
}