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

eqoofvh9  于 2021-08-09  发布在  Java
关注(0)|答案(5)|浏览(435)

我是第一次使用ado.net实体框架,在将此记录插入数据库之前,我需要检查它是否存在。我最好搜索authodssid是否存在,而不是键(authord)。我使用的是vs2010,framework4。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

}
rmbxnbpk

rmbxnbpk1#

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

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

aelbi1ox2#

这样的方法应该有用:

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.
q5iwbnjs

q5iwbnjs3#

从.net的Angular 来看,我个人更喜欢这种方法。它更干净,如果你关心速度(在.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;
}
0vvn1miw

0vvn1miw4#

EFV5.0中提供了所谓的“upsert”操作+

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

addorupdate可以在“system.data.entity.migrations”命名空间中找到,因此不要忘记添加:

using System.Data.Entity.Migrations;

addorupdate操作不是原子的。但是*if(existingauthorcount==0){//do your insert}也不是。

pb3skfrl

pb3skfrl5#

你所需要做的就是(用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
}

相关问题