gpt4 book ai didi

c# - 避免在 EF 中插入时出现 key 冲突

转载 作者:行者123 更新时间:2023-11-30 22:41:30 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 4 和 SQL Server 2008 R2。我有一种情况,我想插入一条主键字段可能匹配现有记录的记录。我不想引发错误,而是希望用新数据静默更新现有记录。

我目前的实现是这样的:

// Calculate primary key fields.
DateTime endDate = periodTime.AddMinutes(periodMins);
int meterId = pipe.MeterId;

// Try to load a matching record.
ProfileDatum lpRec = context.ProfileData.FirstOrDefault(rec => rec.MeterId == meterId && rec.EndDate == endDate);
// If it could not be loaded, create a new one.
if (lpRec == null)
{
lpRec = new ProfileDatum() {MeterId = meterId,
EndDate = endDate};

// Save the object in the context.
context.ProfileData.AddObject(lpRec);
}

// Fill lpRec.

这可行,但在效率、可读性和优雅方面都非常糟糕。

坚持使用 Entity Framework 和 SQL Server 2008 R2,有没有什么方法可以做像 MySQL 的“重复键更新”这样的事情,我每次都像创建一条新记录一样继续,并在有主键时更新数据库违反?或者也许还有其他一些优雅的方法?

效率很好,但在这种情况下是次要的;我追求的是简单。如果能够的话就太好了编写如下并省略客户端检查:

// Assign primary key fields.
var lpRec = new ProfileDatum()
{
MeterId = pipe.MeterId,
EndDate = periodTime.AddMinutes(periodMins)
};

// Fill lpRec.

// Save the object in the context.
context.ProfileData.AddObject(lpRec);

提前感谢您提供的任何帮助,即使是说我现有的实现是最好的方法。

最佳答案

可以使用 ObjectContext.GetObjectByKey/TryGetObjectByKey 吗?

根据msdn帮助:http://msdn.microsoft.com/en-us/library/bb738728.aspx

TryGetObjectByKey 会先查看加载对象的列表,如果对象不存在,它会尝试通过 PK 从存储中加载它。如果加载失败(它不在数据库中),则 TryGetObjectByKey 将返回 false(GetObjectByKey 将抛出)


IEnumerable<KeyValuePair<string, object>> entityKeyValues =
new KeyValuePair<string, object>[]
{
new KeyValuePair<string, object> ("MeterId", meterId);
}

EntityKey key = new EntityKey("YourContainerName.YourEntitySetName", entityKeyValues);
object entity = null;
if(context.TryGetObjectByKey(key, out entity))
{
//the entity exists either in memory, or in the db
}
else
{
// you need to insert a new one
}

关于c# - 避免在 EF 中插入时出现 key 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4785221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com