防止重复项保存在数据库中

本文关键字:存在 数据库 保存 | 更新日期: 2023-09-27 18:27:33

我制作了一个控制台应用程序,它使用实体框架保存数据,我有一个设计如下的表:

ID     People_ID   People_Address    People_Postcode
---    ----------  --------------    ----------------
1       2          76 Nation Road     B27 8NT
2       7          88 Grimestone Road B45 9WG
3       12         45 Wallock Road    B22 4UI

为了确保重复项不会存储在表中,已编写以下代码:

ppl.People_Address = Address;
ppl.People_Postcode = Postcode;
ppl.People_ID = usr.ID;

If(db.tbl_people.Any(x=> x.people_address != ppl.People_Address) && (db.tbl_people.Any(x=> x.people_postcode != ppl.People_Postcode) &&  (db.tbl_people.Any(x=> x.People_ID != ppl.People_ID) {
db.tbl_people.Add(ppl)
db.SaveChanges();
}

然而,无论表中是否没有可供比较的内容,都不会添加任何内容,有什么帮助吗??

防止重复项保存在数据库中

您需要检查每个字段是否为null。例如:

x.people_address != ppl.People_Address || x.people_adress == null

问题在于条件

if (db.tbl_people.Any(x=> x.people_address != ppl.People_Address)
    && (db.tbl_people.Any(x=> x.people_postcode != ppl.People_Postcode)
    && (db.tbl_people.Any(x=> x.People_ID != ppl.People_ID)

它真的应该是

if (!db.tbl_People.Any(x => x.people_address == ppl.People_Address
    && x.people_postcode == ppl.People_Postcode
    && x.People_ID == ppl.People_ID))
{
    // No duplicate
}

此代码几乎没有问题。

首先,每次调用"db.tbl_public"属性getter时,不应多次导致数据库崩溃。只做一次,不要检索整个数据库集合。

第二,对于空数据库

db.tbl_people.Any(x=> x.people_address != ppl.People_Address)

返回false,因为tbl_people集合中没有实体。

第三,你的条件是没有真正检查数据库中的重复项。

您的查询可能看起来像下面的代码:

// if there is no entities with same properties
if(db.tbl_people.Count(p => p.people_address == ppl.People_Address 
                         && p.people_postcode == ppl.People_postcode 
                         && p.People_ID == ppl.People_ID) == 0)
{
    // then save new entity
    db.tbl_people.Add(ppl)
    db.SaveChanges();
}

这段代码将生成对数据库的查询,数据库将只返回标量变量,这将对性能和通信通道更好。