À la fois ObjectContext
et DbContext
ont des méthodes qui tentent de trouver une entité déjà chargée du contexte en mémoire - GetObjectByKey
pour ObjectContext
et Find
pour DbContext
. En utilisant ces méthodes, vous évitez de charger une entité Language
plus d'une fois depuis la base de données.
Les deux méthodes ont besoin d'une valeur de clé primaire en tant que paramètre d'entrée pour rechercher l'entité par clé. Fondamentalement, pensez à ces méthodes comme accédant à un dictionnaire interne qui relie la clé primaire à l'objet entité.
Maintenant, en référence à votre commentaire...
Essentiellement en essayant de faire correspondre sur une valeur personnalisée plutôt que la valeur de l'id/clé primaire.
...vous ne pouvez pas utiliser ces méthodes car elles dépendent de la connaissance de la valeur de clé primaire que vous souhaitez rechercher.
Ce que je ferais serait de reproduire la logique du dictionnaire interne mentionné par votre propre dictionnaire qui relie votre "valeur personnalisée" à l'entité au lieu de la clé primaire. Je suppose que la valeur personnalisée est unique dans la table Language
.
Ainsi, l'idée serait la suivante :
Étant donné que vous avez des entités comme ceci...
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; } // valeur de clé primaire
public string CustomValue { get; set; } // la valeur personnalisée unique
// ... more
}
...et que vous avez une collection de données que vous utilisez pour insérer les nouvelles entités...
public class Data
{
public string SomeOtherValue { get; set; }
public string LanguageCustomValue { get; set; }
// ... more
}
var dataList = new List
{
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
}
...alors vous pourriez utiliser ceci :
using (var context = new MyContext())
{
var dict = new Dictionary();
foreach (var data in dataList)
{
Language language;
if (!dict.TryGetValue(data.LanguageCustomValue, out language))
{
// charger la langue une seule fois depuis la base de données
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); // ou AddObject
}
context.SaveChanges();
}
Cela chargerait une seule entité Language
par LanguageCustomValue
, le ferait une seule fois et ne créerait pas de doublons d'objets Language
dans la base de données.