在插入新记录之前,请检查记录是否存在

本文关键字:检查 记录 是否 存在 插入 新记录 | 更新日期: 2023-09-27 18:24:43

我是第一次使用Ado.net实体框架,在将该记录插入数据库之前,我需要检查它是否存在。我最好搜索是否存在AuthodSSID而不是密钥(AuthorID)。我使用的是VS2010,Framework 4。System.Data.Entity为3.5.0.0。

我在谷歌上搜索了一下,但没有找到这个问题的答案。

PublishingCompanyEntities publishContext;
publishContext = new PublishingCompanyEntities();
private void createNew_Click(object sender, EventArgs e)
{
    Author newAuthor = new Author();
    newAuthor.FirstName = firstName.Text;
    newAuthor.LastName = lastName.Text;
    newAuthor.AuthodSSID = 20;
    newAuthor.AuthorID = 10
//Check if record exist here
    publishContext.AddToAuthor(newAuthor);//insert if does not exist
}

在插入新记录之前,请检查记录是否存在

检查记录是否存在的唯一方法是查询记录并查看是否返回任何内容:

var existingAuthorCount = publishContext.Author.Count(a => a.AuthodSSID == 20);
if (existingAuthorCount == 0) 
{
    // Do your insert
}

这样的东西应该可以工作:

if (publishContext.Author.Select(a => a.AuthodSSID).Where(id => id == 20).Take(1) == null)
    // It doesn't exist
else
    // It does exist

根据我的理解(尽管是基本的),这应该会产生一个SQL语句,相当于:

SELECT TOP(1) AutodSSID FROM Author WHERE AuthodSSID = 20;

另一种更简单的方法可能是使用Any扩展方法:

if (!publishContext.Author.Any(a => a.AuthodSSID == 20))
    // Put your insert logic here.

从.NET的角度来看,我个人更喜欢这种方法。它更干净,如果你关心速度(在.NET中),它会更高效,但SQL并不是那么快;

private bool CheckIfEntityRecordExists(Entity e)
{
    var retVal = false;
    using (var db = new EntityContext())
    {
        retVal = db.AdviserClients.Any(a => a.Id == e.Id);
    }
    return retVal;
}

因此,对于一个高效的SQL语句,以下是最好的:

private bool CheckIfEntityRecordExists(Entity e)
{
    var retVal = false;
    using (var db = new EntityContext())
    {
        retVal = db.AdviserClients.Count(a => a.Id == e.Id) > 0;
    }
    return retVal;
}

建议此方法仅用于向种子数据的迁移,而不是作为upstart方法

有所谓的";upstart";操作在EF v5.0+中可用

publishContext.Author.AddOrUpdate(x => x.Id, newAuthor)

AddOrUpdate可以在";系统.数据.实体.迁移;命名空间,所以不要忘记添加:

using System.Data.Entity.Migrations;

AddOrUpdate操作不是原子操作。但是*if(existingAuthorCount==0){//Do your insert}也不是。

您所需要做的就是(使用linq)搜索具有该ID的作者。

Where()方法将返回一个只需要一个的作者集合,因此使用FirstOrDefault()返回第一个元素,如果没有,则返回null。您也可以使用SinglOrDefault,如果列表中有多个元素,它会抛出异常,或者只返回该元素。

看来@Jacob有一个非常好、更高效的方法!

var author = publishContext.Authors.Where
                               (a=>a.AuthodSSID == 10).FirstOrDefault();
if(author == null) //none exist
{//don't bother creating one unless you need to..
    Author newAuthor = new Author();
    newAuthor.FirstName = firstName.Text;
    newAuthor.LastName = lastName.Text;
    newAuthor.AuthodSSID = 20;
    newAuthor.AuthorID = 10
    publishContext.AddToAuthor(newAuthor);//insert if does not exist
}