Digamos que tengo el siguiente modelo conceptual, hay strories que tienen etiquetas (más de uno, por lo que es una relación muchos a muchos), además cada etiqueta pertenece a una categoría en particular.Entity Framework: evitar la inserción de duplicados
Mis datos provienen de una fuente externa y antes de insertarlo deseo asegurarme de que no se agreguen etiquetas duplicadas.
Actualizado fragmento de código:
static void Main(string[] args)
{
Story story1 = new Story();
story1.Title = "Introducing the Entity Framework";
story1.Tags.Add(new Tag { Name = ".net", });
story1.Tags.Add(new Tag { Name = "database" });
Story story2 = new Story();
story2.Title = "Working with Managed DirectX";
story2.Tags.Add(new Tag { Name = ".net" });
story2.Tags.Add(new Tag { Name = "graphics" });
List<Story> stories = new List<Story>();
stories.Add(story1);
stories.Add(story2);
EfQuestionEntities db = new EfQuestionEntities();
Category category = (from c in db.Categories
where c.Name == "Programming"
select c).First();
foreach (Story story in stories)
{
foreach (Tag tag in story.Tags)
{
Tag currentTag = tag;
currentTag = GetTag(tag.Name, category, db);
}
db.Stories.AddObject(story);
}
db.SaveChanges();
}
public static Tag GetTag(string name, Category category, EfQuestionEntities db)
{
var dbTag = from t in db.Tags.Include("Category")
where t.Name == name
select t;
if (dbTag.Count() > 0)
{
return dbTag.First();
}
var cachedTag = db.ObjectStateManager.GetObjectStateEntries(EntityState.Added).
Where(ose => ose.EntitySet == db.Tags.EntitySet).
Select(ose => ose.Entity).
Cast<Tag>().Where(x => x.Name == name);
if (cachedTag.Count() != 0)
{
return cachedTag.First();
}
Tag tag = new Tag();
tag.Name = name;
tag.Category = category;
db.Tags.AddObject(tag);
return tag;
}
Sin embargo, me sale una excepción sobre un objeto con el mismo EntityKey que ya está presente en el ObjectContext.
Además, si elimino la instrucción else obtendré una excepción sobre la violación de una restricción FK, por lo que parece que su atributo Categoría está establecido en nulo.
¡Gracias! Voy a intentar eso ahora. Por cierto, ¿sigues usando EF después de enfrentar caídas de pozo como esa? –
@Mike: lo soy. No había nada que no pudiera encontrar una forma aceptable de resolver dadas mis modestas necesidades, y lo que estaba usando antes de que EF (SubSonic) fuera aún peor. – Jon
@Jon: Gracias también por ese fragmento de código.Desafortunadamente, sigo recibiendo esa excepción de violación FK que debe significar que hay entidades rastreadas con Categoría = nula –