Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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 core 是否更新ef core中的实体,而不查询该实体并指定备用密钥?_Entity Framework Core - Fatal编程技术网

Entity framework core 是否更新ef core中的实体,而不查询该实体并指定备用密钥?

Entity framework core 是否更新ef core中的实体,而不查询该实体并指定备用密钥?,entity-framework-core,Entity Framework Core,我只想通过指定alternateKey来更新实体(无需请求)。这可能吗 using (var db = GetContext()) using (var transaction = db.Database.BeginTransaction()) { // [...] var status = new ImportStatus(); status.ID = 201; // don't know the real PK. With PK it works! sta

我只想通过指定alternateKey来更新实体(无需请求)。这可能吗

using (var db = GetContext())
using (var transaction = db.Database.BeginTransaction())
{
    // [...]

    var status = new ImportStatus();
    status.ID = 201;  // don't know the real PK. With PK it works!
    status.Symbol = symbol; // this is the alternateKey
    status.DateLastImport = DateTime.Now;

    db.Attach(status);
    db.Entry(status).Property("DateLastImport").IsModified = true;

    await db.SaveChangesAsync(cancellationToken);
    await transaction.CommitAsync(cancellationToken);
}
尝试使用DbContext.Entry()显式设置状态,它应该可以工作:

using (var db = GetContext())
using (var transaction = db.Database.BeginTransaction())
{
    // [...]

    var status = new ImportStatus();

    status.Symbol = symbol;
    status.DateLastImport = DateTime.Now;

     //Explicitly setting the State should be all you need to do
    context.Entry(status).State = EntityState.Modified;

    await db.SaveChangesAsync(cancellationToken);
    await transaction.CommitAsync(cancellationToken);
}
编辑:

EF Core 3.0中有一个突破性的变化,这里提出的解决方案将不起作用:如果PK未设置,即使您显式设置了持久状态,实体也将被视为已添加。更多信息

尝试使用DbContext.Entry()显式设置状态,它应该可以工作:

using (var db = GetContext())
using (var transaction = db.Database.BeginTransaction())
{
    // [...]

    var status = new ImportStatus();

    status.Symbol = symbol;
    status.DateLastImport = DateTime.Now;

     //Explicitly setting the State should be all you need to do
    context.Entry(status).State = EntityState.Modified;

    await db.SaveChangesAsync(cancellationToken);
    await transaction.CommitAsync(cancellationToken);
}
编辑:


EF Core 3.0中有一个突破性的变化,这里提出的解决方案将不起作用:如果PK未设置,即使您显式设置了持久状态,实体也将被视为已添加。更多信息

现在我得到:
System.InvalidOperationException:“实体类型“ImportStatus”上的属性“ID”在尝试将实体状态更改为“Modified”时具有临时值。显式设置永久值或确保数据库配置为为此属性生成值。
这看起来也像是试图插入记录。@Viper我看到了问题,在这里发布的链接中有更多信息,也许你可以应用他们建议的解决方法,如果这是一个旧版应用,你正在升级好的捕获。谢谢你的进一步调查。遗憾的是,我无法在我的应用程序中使用变通方法。现在,我将选择实体,然后更新它。这很烦人,也不是问题:DNow i get:
System.invalidoOperationException:“实体类型“ImportStatus”上的属性“ID”在尝试将实体的状态更改为“Modified”时有一个临时值。”。显式设置永久值或确保数据库配置为为此属性生成值。
这看起来也像是试图插入记录。@Viper我看到了问题,在这里发布的链接中有更多信息,也许你可以应用他们建议的解决方法,如果这是一个旧版应用,你正在升级好的捕获。谢谢你的进一步调查。遗憾的是,我无法在我的应用程序中使用变通方法。现在,我将选择实体,然后更新它。这只是烦人,不是问题:D