Giả sử, tôi có mô hình khái niệm sau đây, có các tầng có thẻ (nhiều hơn một, vì vậy đó là mối quan hệ nhiều-nhiều), cộng với mỗi thẻ thuộc về một danh mục cụ thể.Khuôn khổ thực thể: Tránh chèn trùng lặp
Dữ liệu của tôi đến từ một nguồn bên ngoài và trước khi chèn nó, tôi muốn đảm bảo rằng không có thẻ trùng lặp nào được thêm vào.
Cập nhật đoạn mã:
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;
}
Tuy nhiên, tôi nhận được một ngoại lệ về một đối tượng với các EntityKey cùng đó là đã có trong ObjectContext.
Ngoài ra, nếu tôi xóa câu lệnh khác, tôi sẽ nhận được ngoại lệ về việc vi phạm ràng buộc FK, vì vậy có vẻ như thuộc tính Danh mục của nó được đặt thành rỗng.
Cảm ơn bạn! Tôi sẽ thử điều đó ngay bây giờ. Bằng cách này, bạn vẫn đang sử dụng EF sau khi hố phải đối mặt như vậy? –
@Mike: Tôi. Không có gì là tôi không thể tìm ra một cách có thể chấp nhận được để giải quyết những nhu cầu khiêm tốn của tôi, và những gì tôi đang sử dụng trước khi EF (SubSonic) thậm chí còn tồi tệ hơn. – Jon
@Jon: Cũng xin cảm ơn đoạn mã đó.Rất tiếc, tôi vẫn nhận được ngoại lệ vi phạm FK đó phải có nghĩa là các thực thể được theo dõi có Danh mục = null –