- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 SO 和互联网上的文章中发现了很多问题,但没有一个真正解决了我的问题。
每天左右“播放”都会更新(通过包含信息的 XML 文件)。
internal Play ParsePlayInfo(XDocument doc)
{
Play play = (from p in doc.Descendants("Play")
select new Play
{
Theatre = new Theatre()
{
//Properties
},
//Properties
LastUpdate = DateTime.Now
}).SingleOrDefault();
var actors = (from a in doc.XPathSelectElement(".//Play//Actors").Nodes()
select new Lecturer()
{
//Properties
});
var parts = (from p in doc.XPathSelectElement(".//Play//Parts").Nodes()
select new Part()
{
//Properties
}).ToList();
foreach (var item in parts)
{
play.Parts.Add(item);
}
var reviews = (from r in doc.XPathSelectElement(".//Play//Reviews").Nodes()
select new Review
{
//Properties
}).ToList();
for (int i = 0; i < reviews.Count(); i++)
{
PlayReviews pR = new PlayReviews()
{
Review = reviews[i],
Play = play,
//Properties
};
play.PlayReviews.Add(pR);
}
return play;
}
如果我通过 Add() 添加这个“play”,Play 的每个 Childobject 都将被插入——不管是否已经存在。由于我需要更新现有条目,因此我必须为此做些事情。我想这里的问题是我在 XML 中没有任何 ID。
据我所知,我有以下选择:
目前我正在实现选项 1 - 但感觉不对。
我想做的是更新数据库中已有的实体并插入不存在的新实体。在附加/添加播放之前我必须调用 SaveChanges() 吗?必须有一个(相对)简单的解决方案。如果有人能在这方面指导我正确的方向,我将不胜感激。
最佳答案
好吧,既然还没有答案,我自己写一个。
对于那些想知道的人,我让它工作了 - 代码看起来很难看,我猜性能更差。但是因为不会有很多用户,而且这个方法只会在一天晚上调用一次,所以我暂时可以接受。
我做了什么?
好吧,我选择了选项 2 和 3。
private Play UpdatePlay()
{
using (RepositoryContext context = new RepositoryContext())
{
HttpRequest http = new HttpRequest();
PlayRepository rep = new PlayRepository(context);
ActorRepository actRep = new ActorRepository(context);
ReviewsRepository revRep = new ReviewsRepository(context);
TheatreRepository insRep = new TheatreRepository(context);
PartRepository partRep = new PartRepository(context);
Parser p = new Parser();
XDocument doc = http.GetPlayInfo();
Theatre theatre = p.ParseTheatreInfo(doc);
List<Actor> actors = p.ParseActorInfo(doc);
List<PlayReviews> playReviews = p.ParseReviewsInfo(doc);
for (int i = 0; i < actors.Count; i++)
{
actors[i] = actRep.AddOrUpdate(actors[i]);
}
for (int i = 0; i < playReviews.Count; i++)
{
playReviews[i].Reviews = revRep.AddOrUpdate(playReviews[i].Reviews);
}
theatre = insRep.AddOrUpdate(theatre);
Play play = p.ParsePlayInfo(doc);
List<Part> parts = GetParts(play);
for (int i = 0; i < parts.Count; i++)
{
List<Actor> lec = (List<Actor>)parts[i].Actors;
for (int j = 0; j < lec.Count; j++)
{
lec[j] = actRep.AddOrUpdate(lec[j]);
}
}
play = rep.AddOrUpdate(play);
context.LoadProperty(play, o => o.Theatre);
context.LoadProperty(play, o => o.Actors);
context.LoadProperty(play, o => o.PlayReviewss);
context.LoadProperty(play, o => o.Parts);
rep.Save();
if (play.Theatre != theatre)
play.Theatre = theatre;
play = rep.AddParts(parts, play);
play = rep.AddActor(actors, play);
for (int i = 0; i < playReviews.Count; i++)
{
playReviews[i].Play = play;
playReviews[i] = revRep.AddPlayInformation(playReviews[i]);
}
rep.Save();
return play;
}
}
(顺便说一句,我刚刚意识到我之前忘记发布我的这部分代码...)
如您所见,Save() 被调用了两次 - 当您考虑 AddOrUpdate() 中发生的事情时,情况会变得更糟:
public Actor AddOrUpdate(Actor entity)
{
Actor cur = context.Actors.Where(l => l.Name == entity.Name && l.Last_Name == entity.Last_Name).FirstOrDefault();
if (cur == null)
{
context.Actors.AddObject(entity);
return entity;
}
else
{
if (!entity.Mail.IsNullOrEmptyOrWhitespace() && cur.Mail != entity.Mail)
cur.Mail = entity.Mail;
//there are more of these...
return cur;
}
}
我无法相信这是执行此操作的“正确”方法。感觉和看起来都是错误的。也许 EF 也有责任,拿
FirstEntityType first = new FirstEntityType();
first.Id = 2;
List<SecondType> list = CreateList(); //Let's say this returns a List with 10 elements
context.FirstEntityType.AddObject(first);
for (int i = 0; i < list.Count; i++)
{
list[i].First = first;
}
//just for arguments sake a second for
for (int i = 0; i < list.Count; i++)
{
context.SecondType.AddObject(list);
}
context.SaveChanges();
我没有测试过这段特定的代码,但根据我的经验,我最终会得到 10 个用于 SecondType 的新条目,如果我没记错的话,11 个用于 FirstEntityType。
为什么?为什么 EF 中没有一种机制说“嘿,等一下 - 它们是一样的!”
如果我直接使用数据库,我是否认为 EF 的行为应该是错误的?在我的示例中,我添加了“first”,这样我就可以假设每当我使用“first”时都会引用它。(我真的希望我的例子能像描述的那样工作——没有时间也不想测试它)
关于c# - Entity Framework - 更新没有 Id 的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3000817/
都是整数,但一直报错 "Only assignment, call, increment, decrement, await, and new object expressions can be us
我有以下情况:一个“对话”实体/表,它有多个关联的标签。Tag 也是一个实体/表 - key/id 是 tagName(一个字符串)。 在客户端 (javascript),我在处理标签时使用字符串数组
我想通过 maven java 源代码生成器自动生成 java 源代码。我想通过查看一个大实体 xml 文件来创建实体类,该文件将包含系统中的所有实体和实体关系。据我搜索,目前maven中没有这样的插
我有一段时间有这个疑问,有人说 EJB 3.0 中没有所谓的实体 bean。有没有可能这样说,EJB 3.0 使用 JPA 来持久化数据并且没有对以前版本(EJB 2.1)中的实体 bean 进行增强
我观看了关于 Core Data 的 2016 WWDC 视频并查看了各种教程。我见过使用 Core Data Framework 创建对象以持久保存到 managedObjectContext 中的
实体(entites) 用于定义引用普通文本或特殊字符的快捷方式的变量,可在内部或外部进行声明 实体引用是对实体的引用 声明一个内部实体 语法: <!ENTITY 实体名称 "
This page建议 !ENTITY: If you want to avoid duplication, consider using XML entities (for example, [ ]
我正在努力解决这个问题:如何判断一个概念是聚合根还是只是一个实体(属于 AR 的一部分)? : 他们都有 ID 它们都是由实体或值对象组成 也许如果我需要引用其他 AR 中的实体,那么我需要将其设为
我使用 Symfony2 和 Doctrine,我有一个关于实体的问题。 出于性能方面的考虑,我想知道是否可以在不进行所有关联的情况下使用实体? 目前,我还没有找到另一种方法来创建继承带有关联的类的模
我已经尝试在 HTML 中包含以下代码,用于附加文件符号。但它显示一个空的白框。 📎 📎 📎 是否有替代的 HTML 附加文件符号实体? 如果没有,我们可以手动创建
我在 grails 中有一个域类......我如何让 gorm 在创建数据库时忽略这个实体?就别管它了。 最佳答案 如果我理解,你不想从域类创建表?如果是,请在域类中使用此代码: static map
我正在努力解决这个问题:如何判断一个概念是聚合根还是只是一个实体(属于 AR 的一部分)? : 他们都有 ID 它们都是由实体或值对象组成 也许如果我需要引用其他 AR 中的实体,那么我需要将其设为
我已经尝试在 HTML 中包含以下代码,用于附加文件符号。但它显示一个空的白框。 📎 📎 📎 是否有替代的 HTML 附加文件符号实体? 如果没有,我们可以手动创建
如何在我的实体中以 14-04-2017 格式存储日期? 但我必须从字符串中解析它。 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-
我需要从两个连接表中获取数据。数据集是什么类型?我是否需要创建一个包含这两个表中的属性的类以用于数据集类型,或者我可以使用实体模式中的类型。我如何修改我的方法才能正常工作? public static
好的,我们正在尝试建立一个中央站点来查看来自销售我们产品的多个供应商的数据。这些多个供应商使用不同的销售系统(确切地说是两个不同的系统),因此每个数据库看起来完全不同。我们与他们的数据库同步,因此数据
我是 backbone 的新手。但是当我研究模型实体时,我不明白一些事情。如果我们可以像 java 或 C# 这样的标准语言一样定义模型属性,那就太好了。有没有可能是这样的。所以我的想法是这样的: M
我想获取存储在可绘制的 xml 文件中的形状的颜色。 我来到了将 Drawable 存储在 Drawable 变量中的步骤,所以,现在我想获取形状的颜色(纯色标签)。 有什么建议吗? 最佳答案 Gra
实体是直接映射到我们的数据库(我们用于 Hibernate)的类。 在调用 DAO 之前,我们的服务类包含这些实体的业务逻辑。 我们还有命令对象,它们是与特定 View 相关的 POJO。有人告诉我实
在我的应用程序中,我需要显示不同存储过程返回的记录列表。每个存储过程返回不同类型的记录(即列数和列类型不同)。 我最初的想法是为每种类型的记录创建一个类,并创建一个函数来执行相应的存储过程并返回 Li
我是一名优秀的程序员,十分优秀!