复制实体但使用新密钥的最佳方法是什么?

时间:2011-10-30 13:09:48

标签: c# asp.net-mvc-3 entity-framework-4

我有一个数据库,用于保存日历,这些日历分布在几个表中,每个表使用FK ...

一切正常但现在我想能够说出

  

根据日历ID:62

创建一个包含所有功能的新日历

我尝试了一种方式但是很糟糕,女巫正在浏览我的所有存储库Update区域并触发每个onde,这将在每个表格上创建新内容......

是否有更快的解决方案?

我们可以简单地说的一种方式

db.Entity<Calendar>(CalendarId).CloneAsNew();

所以我最终会:

[Table Calendars]
calendar_id    Name    Url
62             Cal_A   url_A
74             Cal_A   url_A

[Table CalendarContents]
content_id   calendar_id  type   img_background    img_top
14           62           1      bkg.png           top.png
26           74           1      bkg.png           top.png

之前只有一个日历,如

[Table Calendars]
calendar_id    Name    Url
14             Cal_A   url_A

[Table CalendarContents]
content_id   calendar_id  type   img_background    img_top
14           62           1      bkg.png           top.png

P.S。如果你分开并再次附上它,如

context.Detach(entity);
entityCollection.Add(entity);

我们放弃了所有引用: - /

2 个答案:

答案 0 :(得分:0)

试试这个:(使用EF 4.1)

使用查询中的NoTracking扩展方法检索要复制的日历。 然后将Id更改为0并执行do:

Context.Entry(calendar).State = EntityState.Added;

Context.SaveChanges();

答案 1 :(得分:0)

EF没有提供克隆实体图的任何方法。此时你需要通用解决方案:

  • 创建存储过程以克隆日历,将其映射为函数导入,并将其用于克隆和检索新日历的ID。一旦您有Id执行新查询以加载新日历的整个实体图。
  • 获取整个旧日历的实体图并创建深度克隆(您必须将实体图序列化为流并将其反序列化为新的实体图)。将新实体图添加到上下文并保存更改。它应该在新图中插入所有实体。