实体框架4,POCO对象和ASP.Net MVC2.我有很多关系,比如BlogPost和Tag实体之间的关系.这意味着在我的T4生成的POCO BlogPost类中,我有:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
Run Code Online (Sandbox Code Playgroud)
我要求一个BlogPost和来自ObjectContext实例的相关标签,并将其发送到另一层(MVC应用程序中的View).稍后我回到更新的BlogPost,更改了属性并更改了关系.例如,它具有标签"A""B"和"C",并且新标签是"C"和"D".在我的特定示例中,没有新的标签,并且标签的属性永远不会改变,因此唯一应该保存的是改变的关系.现在我需要将它保存在另一个ObjectContext中.(更新:现在我尝试在同一个上下文实例中执行,但也失败了.)
问题:我无法正确保存关系.我尝试了我发现的一切:
"不起作用"意味着在大多数情况下我使用给定的"解决方案",直到它不产生错误并至少保存BlogPost的属性.关系会发生什么变化:通常使用新的PK将标签添加到Tag表中,并且保存的BlogPost引用那些而不是原始的.当然返回的标签有PK,在保存/更新方法之前,我检查PK并且它们等于数据库中的PK,所以EF可能认为它们是新对象而那些PK是临时的.
我知道的一个问题,并且可能使得无法找到自动化的简单解决方案:当POCO对象的集合发生更改时,应该通过上面提到的虚拟集合属性发生,因为那时FixupCollection技巧将更新另一端的反向引用多对多关系.但是,当View"返回"更新的BlogPost对象时,这种情况并未发生.这意味着对我的问题可能没有简单的解决方案,但这会让我非常伤心,我会讨厌EF4-POCO-MVC的胜利:(.这也意味着EF无法在MVC环境中做到这一点,无论哪个使用EF4对象类型:(.我认为基于快照的更改跟踪应该发现更改的BlogPost与具有现有PK的标签有关系.
顺便说一句:我认为同一个问题发生在一对多的关系上(谷歌和我的同事这么说).我会在家里尝试一下,但即使这样做对我的应用程序中的六个多对多关系没有帮助:(.
我一直在阅读.net中的自跟踪实体以及如何从*.edmx文件生成它们.我正在努力理解的是生成这些实体的原因是什么让你了解基本的EF实体?此外,有些人提到了自我跟踪实体和Silverlight,但为什么要使用这些实体而不是客户端或RIA服务生成的共享类?
自我跟踪实体有什么意义,为什么要使用它们?
我们正在开始一个新的基于Web的产品,我们计划通过WCF服务公开我们的业务逻辑.我们将使用ASP.NET 4.0,C#,EF 4.0.将来我们希望基于这些服务构建iphone应用程序和WPF应用程序.我一直在阅读很多关于使用POCO和自我跟踪实体(STE)的内容,据我所知,STEs在网络方案中效果不佳.任何人都能更清楚地了解这个问题吗?
去年,我使用Entity Framework(当然是.NET3.5)为我们的项目开发了一个数据访问服务,并使用Julie Lerhman的书作为指导开发了状态跟踪POCO对象.我们使用WCF并且还拥有Silverlight 3客户端.我们正在转向.NET 4.0,我想转而使用代码生成来消除浪费的开发人员编写POCO类和翻译类的时间.
通过我所做的研究,似乎有三种状态跟踪POCO:
1)更改了跟踪代理:对我们似乎没有用,因为它似乎不适用于WCF序列化.
2)基于快照:检索POCO实体图时拍摄快照,将客户端返回的图与该快照进行比较,比较差异......对我来说似乎不错.
3)自跟踪实体:代码生成器生成用于在POCO对象内进行自我跟踪的逻辑.这似乎与我们现在所做的很接近,除非它是为我们生成的.
我试图弄清楚所有这些方法之间的优缺点.我猜测1和2是"连接"的,并且他们需要最初查询POCO以保持实例化的ObjectContext,但是无法确认这一点.我也没有看到为什么有人会真的打扰选项1的原因,因为选项3似乎做同样的事情......
快照似乎对我来说最简单,但如果这需要ObjectContext保持打开很长一段时间我不太确定...
我只是一名初级程序员,所以这里有任何建议,特别是关于Silverlight 3(我相信选项2和3适用于Silverlight 3但2可能有问题)非常感谢.
我的代码是这样的:
public class Program
{
[STAThread]
static void main()
{
DataAccessClass dal = new DataAccessClass();
List<Person> list = dal.GetPersons();
Person p = list[0];
p.LastName = "Changed!";
dal.Update(p);
}
}
public class DataAccessClass
{
public static List<Person> GetPersons()
{
MyDBEntities context = new MyDBEntities();
return context.Persons.ToList();
}
public void Update(Person p)
{
// what sould be written here?
}
}
Run Code Online (Sandbox Code Playgroud)
现在请告诉我应该在Update()方法中写什么?我写的一切,遇到各种例外.(请注意加载的数据是跟踪,连接或类似的)
有什么问题我可以问自己我们的设计,以确定我们是否应该在我们的应用程序中使用DTO或自我跟踪实体?
以下是我所知道的一些需要考虑的事项:
那么,我怎样才能确定哪些适合我们?我之前从未使用EF,所以我真的不知道STE是否适合我们.
我见过人们建议从STE开始,只有当它成为一个问题时才实施DTO,但是我们目前有DTO并且正在尝试决定使用STE是否会让生活变得更轻松.我们在这个过程中已经足够早,切换不会花费太长时间,但我不想切换到STE只是为了发现它对我们不起作用并且必须切换回来.
wcf poco n-tier-architecture entity-framework-4 self-tracking-entities