gpt4 book ai didi

entity-framework - Entity Framework ,插入时自动链接到现有实体

转载 作者:行者123 更新时间:2023-12-03 07:10:08 25 4
gpt4 key购买 nike

我不确定这是否可能,但我正在将很多实体插入数据库中,并且对于每个项目,它都有一个语言属性,它是一个实体。目前,我为要插入的每个项目创建一个新的语言对象,但这只是为了测试,因为它会创建大量重复项。这些语言在数据库中应该是唯一的,并且应该只指向现有的语言记录,我能想到的唯一方法是为每个插入进行单独的服务调用,以查找语言代码并获取现有语言的 id,这是大量的开销。

有没有办法让它根据语言代码自动查找记录并使用该记录?

谢谢

最佳答案

ObjectContextDbContext 都有尝试从内存上下文中查找已加载实体的方法 - ObjectContext 的 GetObjectByKey Find 用于 DbContext。使用这些方法,您可以避免从数据库多次加载Language实体。

这两种方法都需要主键值作为输入参数来通过键查找实体。本质上将这些方法视为访问将主键与实体对象相关联的内部字典。

现在,引用您的评论...

Essentially trying to match on a custom value rather than the id/primary key value.

...您不能使用这些方法,因为它们依赖于了解您要查找的主键值。

我要做的就是通过您自己的字典来模仿上述内部字典的逻辑,将您的“自定义值”与实体而不是主键相关联。我假设自定义值在 Language 表中是唯一的。

所以,想法是:

鉴于您有这样的实体...

public class MyEntity
{
public int Id { get; set; }
public Language Language { get; set; }
public string SomeOtherValue { get; set; }
// ... more
}

public class Language
{
public int Id { get; set; } // primary key value
public string CustomValue { get; set; } // the unique custom value
// ... more
}

...您有一个用于插入新实体的数据集合...

public class Data
{
public string SomeOtherValue { get; set; }
public string LanguageCustomValue { get; set; }
// ... more
}

var dataList = new List<Data>
{
new Data { SomeOtherValue = "A", LanguageCustomValue = "EN" },
new Data { SomeOtherValue = "B", LanguageCustomValue = "FR" },
new Data { SomeOtherValue = "C", LanguageCustomValue = "EN" },
new Data { SomeOtherValue = "D", LanguageCustomValue = "EN" },
// ... more
}

...那么你可以使用这个:

using (var context = new MyContext())
{
var dict = new Dictionary<string, Language>();
foreach (var data in dataList)
{
Language language;
if (!dict.TryGetValue(data.LanguageCustomValue, out language))
{
// load the language only once from the database
language = context.Languages.SingleOrDefault(l =>
l.CustomValue == data.LanguageCustomValue);
dict.Add(data.LanguageCustomValue, language);
}

var myEntity = new MyEntity
{
SomeOtherValue = data.SomeOtherValue,
Language = language
};

context.MyEntities.Add(myEntity); // or AddObject
}
context.SaveChanges();
}

这只会为每个 LanguageCustomValue 加载一个 Language 实体,仅执行一次,并且不会在数据库中创建 Language 对象的重复项.

关于entity-framework - Entity Framework ,插入时自动链接到现有实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12424917/

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