Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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
C# 如何在实体框架中更新重复密钥?_C#_Entity Framework - Fatal编程技术网

C# 如何在实体框架中更新重复密钥?

C# 如何在实体框架中更新重复密钥?,c#,entity-framework,C#,Entity Framework,我有一个循环,看起来像这样: foreach(var file in files) { // ... db.Images.Add(new ImageFingerPrint { FileName = file, FingerPrint = fingerprint }); } int recordsAffected = db.SaveChanges(); FileName是主键。如果它已经存在于数据库中,我只希望它更新它的指纹。我想基本上是在做一件事 如果这不容易/不可能,我如何

我有一个循环,看起来像这样:

foreach(var file in files)
{
    // ...
    db.Images.Add(new ImageFingerPrint { FileName = file, FingerPrint = fingerprint });
}

int recordsAffected = db.SaveChanges();
FileName
是主键。如果它已经存在于数据库中,我只希望它更新它的
指纹
。我想基本上是在做一件事


如果这不容易/不可能,我如何简单地截断整个表?

您可以使用

db.Images.Clear();
db.SaveChanges();
假设没有外键约束

如果要获取现有项,请尝试LINQ查询:

var existing = (from im in db.Images
               where im.FileName.Equals(file)
               select im).SingleOrDefault();
if(existing != null)
    existing.FingerPrint = fingerprint;
else
    db.Images.Add(...)
db.SaveChanges();

您可以使用

db.Images.Clear();
db.SaveChanges();
假设没有外键约束

如果要获取现有项,请尝试LINQ查询:

var existing = (from im in db.Images
               where im.FileName.Equals(file)
               select im).SingleOrDefault();
if(existing != null)
    existing.FingerPrint = fingerprint;
else
    db.Images.Add(...)
db.SaveChanges();

我通常使用的模式是

foreach(var file in files)
{
    var image = db.Images.SingleOrDefault(i => i.FileName == file);
    if (item == null)
    {
        image = new ImageFingerPrint() { FileName = file };
        db.Images.Add(image);
    }

    image.FingerPrint = fingerprint;
}    
db.SaveChanges();
当对象具有一些数据库生成的字段(如
IDENTITY
主键、
CreatedDate
列或时间戳)时,这会变得更容易。然后很容易检查这些字段是否为默认字段,如果是,则对象是新的,应该“添加”

根据循环的复杂性,您可能需要预先确定“现有”和“新”文件名-

var existing = files.Where(f => db.Images.Contains(f)); 
// & use .ToList() if you're going to be iterating the collection multiple times

foreach (file in existing)
{
    // updates
}

foreach (var file in files.Except(existing))
{
    // inserts
}

我在有性能优势的情况下使用这种方法,例如,其中一个操作可以作为批量操作完成,而另一个不能。否则,如果插入和更新操作明显不同,它可以使代码更清晰。

我使用的通常模式是

foreach(var file in files)
{
    var image = db.Images.SingleOrDefault(i => i.FileName == file);
    if (item == null)
    {
        image = new ImageFingerPrint() { FileName = file };
        db.Images.Add(image);
    }

    image.FingerPrint = fingerprint;
}    
db.SaveChanges();
当对象具有一些数据库生成的字段(如
IDENTITY
主键、
CreatedDate
列或时间戳)时,这会变得更容易。然后很容易检查这些字段是否为默认字段,如果是,则对象是新的,应该“添加”

根据循环的复杂性,您可能需要预先确定“现有”和“新”文件名-

var existing = files.Where(f => db.Images.Contains(f)); 
// & use .ToList() if you're going to be iterating the collection multiple times

foreach (file in existing)
{
    // updates
}

foreach (var file in files.Except(existing))
{
    // inserts
}

我在有性能优势的情况下使用这种方法,例如,其中一个操作可以作为批量操作完成,而另一个不能。否则,如果插入和更新操作明显不同,则可以使代码更清晰。

DbSet
。另外,是否有一种方法可以在不首先查询的情况下更新它?MySQL有“重复更新”;不确定MS SQL是否有类似的内容。@标记-这不是MS SQL,这是实体框架。它被设计用于与许多不同的数据库提供程序一起工作,因此通常必须避免使用有用的功能,因为并非所有提供程序都支持这些功能。EF中没有重复更新功能。
DbSet
。另外,是否有一种方法可以在不首先查询的情况下更新它?MySQL有“重复更新”;不确定MS SQL是否有类似的内容。@标记-这不是MS SQL,这是实体框架。它被设计用于与许多不同的数据库提供程序一起工作,因此通常必须避免使用有用的功能,因为并非所有提供程序都支持这些功能。EF中没有重复更新功能。