Mik*_*din 7 .net c# linq entity-framework
说,我有以下概念模型,有些标签有多个标签(多个,所以它是多对多的关系),加上每个标签都属于一个特定的类别.
我的数据来自外部源,在插入之前我想确保没有添加重复的标签.
更新的代码段:
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;
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个异常,该对象具有与ObjectContext中已存在的相同的EntityKey.
此外,如果我删除else语句,我将获得有关违反FK约束的异常,因此它的Category属性似乎设置为null.
我用EF也遇到过同样的问题。这就是我最终所做的:
story1.Tags.Add(new Tag { Name = ".net", })路由所有创建: 。Tagstory1.Tags.Add(GetTag(".net"))GetTag方法检查上下文中的标签,看看它是否应该像您一样返回现有实体。如果是,则返回该值。ObjectStateManager是否有Tag实体添加到上下文但尚未写入数据库。如果找到匹配的Tag,则会返回该匹配。Tag,它会创建一个新的Tag,将其添加到上下文中,然后返回它。从本质上讲,这将确保Tag在整个程序中不会使用任何一个以上的实例(无论是已经存在的还是刚刚创建的)。
一些示例代码来自我的项目(使用InventoryItem而不是Tag,但你明白了)。
步骤 3 中的检查是这样完成的:
// Second choice: maybe it's not in the database yet, but it's awaiting insertion?
inventoryItem = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added)
.Where(ose => ose.EntitySet == context.InventoryItems.EntitySet)
.Select(ose => ose.Entity)
.Cast<InventoryItem>()
.Where(equalityPredicate.Compile())
.SingleOrDefault();
if (inventoryItem != null) {
return inventoryItem;
}
Run Code Online (Sandbox Code Playgroud)
如果Tag在步骤 3 中未找到,则以下是步骤 4 的代码:
inventoryItem = new InventoryItem();
context.InventoryItems.AddObject(inventoryItem);
return inventoryItem;
Run Code Online (Sandbox Code Playgroud)
更新:
它应该像这样使用:
Story story1 = new Story();
story1.Title = "Introducing the Entity Framework";
story1.Tags.Add(GetTag(".net", category, db));
story1.Tags.Add(GetTag("database", category, db));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9669 次 |
| 最近记录: |