私は以下の概念モデルを持っています。複数のタグ(複数の関係、多対多の関係)を持つストーリーがあり、各タグは特定のカテゴリに属します。エンティティフレームワーク:重複の挿入を避ける
私のデータは外部ソースからのもので、挿入する前に重複したタグが追加されていないことを確認します。
更新されたコードスニペット:
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;
}
しかし、私はすでにのObjectContextに存在している同じのEntityKeyを持つオブジェクトについての例外を取得します。
また、else文を削除した場合、FK制約違反について例外が発生するため、Category属性がnullに設定されているようです。
ありがとうございました!私は今それを試みます。ところで、あなたはまだそのようなピットに直面した後にEFを使用していますか? –
@Mike:そうです。私の控えめなニーズを考えれば、私が解決できる方法を見つけることができなかったことは何もなかったし、EF(SubSonic)の前に私が使っていたことはさらに悪かった。 – Jon
@Jon:このコードスニペットもありがとうございます。残念ながら、私はまだCategory = nullのトラッキング対象のエンティティがあることを意味するFK違反例外を受け取ります。 –