实体框架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的标签有关系.
顺便说一句:我认为同一个问题发生在一对多的关系上(谷歌和我的同事这么说).我会在家里尝试一下,但即使这样做对我的应用程序中的六个多对多关系没有帮助:(.
我们正在开始一个新的基于Web的产品,我们计划通过WCF服务公开我们的业务逻辑.我们将使用ASP.NET 4.0,C#,EF 4.0.将来我们希望基于这些服务构建iphone应用程序和WPF应用程序.我一直在阅读很多关于使用POCO和自我跟踪实体(STE)的内容,据我所知,STEs在网络方案中效果不佳.任何人都能更清楚地了解这个问题吗?
我正在努力找出实体框架和存储库模式的理想实现.我正在使用Entity Framework 4.3代码优先,而我似乎无法完全理解实体框架的正确用法.
我喜欢EF给桌子带来的东西,比如跟踪实体,延迟加载,导航属性等等.但是根据我的理解,其中一些对于存储库模式并不好用.让我们看一些例子,也许你们可以让我直截了当.
我对通用存储库的初步印象是我不喜欢它,因为我不需要为每个实体提供完全相同的功能.例如,我有一个存储库,用于在数据库中存储简单变量(键/值对).我不需要Add或Delete方法,因为这些是静态变量.我只需要一个Update方法和一个Get方法.通用存储库似乎不是很健壮,并且不允许数据层中有太多自定义代码.我也讨厌通用存储库返回,IQueryable<T>
因为它使上层能够直接针对数据存储编写表达式,而上层必须假设正确使用的数据访问技术实现IQueryable,以便它查询数据库而不是拉一切都记忆中,并从那里查询.
它看起来像通用存储库,特别是返回IQueryable的存储库,并不真正坚持良好的关注点分离.也许你们可以为我清除那个,但是现在我正在使用显式命名的存储库,只返回IEnumerable或IList.
我喜欢导航属性的概念,但在实现存储库模式时,我似乎很少使用它们.例如,我有一个名为"Aliases"的导航属性的用户.如果我想为用户添加别名,通过导航属性添加它会非常容易.
myUser.Aliases.Add(new Alias { Name="cls", Value="ClearScreen" });
Run Code Online (Sandbox Code Playgroud)
但那我在哪里打电话dbContext.SaveChanges()
?我已经myUser
传递给我了,我使用了导航属性,以避免将我IAliasRepository
注入到我所在的类中.但是我现在无法将我的新别名保留到数据库中,因为我的上层不知道实体框架.我现在必须注射我IAliasRepository
,所以我可以_aliasRepository.SaveChanges()
.那么现在感觉就像完全浪费.我觉得我应该使用,_aliasRepository.AddAlias(newAlias)
因为我必须注入存储库.
自我跟踪实体非常棒,但它们不适合您尝试从应用程序的其余部分隐藏数据访问层详细信息的应用程序.例如,如果我正在编写存储库并且完全无知他们将使用EF,那么我肯定会添加一个Update(Entity entity)
方法.但是,在EF中,您不需要这样做,因为您只需对实体进行更改然后调用即可SaveChanges()
.该实体跟踪已修改的所有内容,并将这些更改持久保存到数据库中.
var myEntity = _entityRepository.GetEntity("some unique ID");
myEntity.SomeProperty = "new value";
_entityRepository.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
这导致我消除了我将包含的更新方法,如果我不知道EF不需要它们.这使得重新分解更加困难,因为我可能必须返回并添加适当的更新方法.我唯一的另一种选择是无论如何都要包含这些方法,然后在实现我的存储库时对它们不做任何处理.
public void UpdateEntity(Entity entity)
{
// Do nothing. EF is tracking changes and they will be persisted when
// SaveChanges() is called.
}
Run Code Online (Sandbox Code Playgroud)
所以我的代码看起来像这样,即使它完全没必要.
var myEntity = _entityRepository.GetEntity("some unique ID");
myEntity.SomeProperty …
Run Code Online (Sandbox Code Playgroud) 我正试图加强实体框架,所以我不觉得自己处于黑暗时代.我尝试(并且迄今为止失败)从生成的代码中直觉了解可用代码生成项之间的本质区别.
似乎POCO将实体数据结构与将数据移入/移出数据存储区的ojbect隔离开来.
我不确定"自我跟踪实体"是什么.我猜测跟踪部分是指实现所谓的"工作单元"模式,但我不是正面的.更令人头疼的是,我想我想知道"自我追踪而不是什么?".
有什么问题我可以问自己我们的设计,以确定我们是否应该在我们的应用程序中使用DTO或自我跟踪实体?
以下是我所知道的一些需要考虑的事项:
那么,我怎样才能确定哪些适合我们?我之前从未使用EF,所以我真的不知道STE是否适合我们.
我见过人们建议从STE开始,只有当它成为一个问题时才实施DTO,但是我们目前有DTO并且正在尝试决定使用STE是否会让生活变得更轻松.我们在这个过程中已经足够早,切换不会花费太长时间,但我不想切换到STE只是为了发现它对我们不起作用并且必须切换回来.
wcf poco n-tier-architecture entity-framework-4 self-tracking-entities
我们正在使用.net C#4.0,VS 2010,EF 4.1和遗留代码.
我正在开展一个win form项目,我决定开始使用实体框架4.1来访问ms sql db.代码库很旧,我们有一个使用数据适配器的现有数据层.这些数据适配器遍布各处(在web应用程序和win form应用程序中)我的计划是随着时间的推移用EF替换旧的db访问代码,并摆脱UI层和数据层之间的紧密耦合.
因此,我的想法是或多或少地将EF与遗留数据访问层相结合,并使用EF更加现代地利用EF来缓慢替换旧数据层.所以现在我们需要使用EF和遗留数据库访问代码.
到目前为止我所做的是添加一个包含edmx文件和上下文的项目.edmx是使用数据库第一种方法生成的.我还添加了另一个包含POCO类的项目(通过使用ADO.NET POCO实体生成器).我或多或少地在她的"编程实体框架"一书中关注了Julia Lerman关于如何拆分模型和生成的POCO类的方法.数据库模型已设置多年,并不是更改表和关系,触发器,存储过程等的选项,所以我基本上坚持使用db模型.
我已经阅读了关于存储库模式和工作单元的内容,我有点像模式,但是当我同时使用EF和遗留数据库访问代码来处理时,我很难实现它们.特别是当我没有时间用纯EF实现替换所有遗留数据库访问代码时.在一个完美的世界里,我会重新开始,重新选择数据模型,但这不是一个选择.
存储库和工作单元模式是否可以实现?为了在业务层中使用POCO类,我有时需要使用EF和遗留db代码来填充我的POCO类.换句话说,我有时可以使用EF来检索我需要的部分数据,并使用旧的db访问层来检索其余数据,然后将数据映射到我的POCO类.当我想更新一些数据时,我需要从POCO类中选择数据并使用遗留数据访问代码将数据存储在数据库中.因此,当我想在数据库中保存数据时,我需要在UI中显示数据,反之亦然,我需要将从遗留数据访问层检索到的数据映射到我的POCO类.
为了使事情复杂化,我们将一些数据存储在表中,我们不知道运行前的名称(请不要问我为什么:-)).因此,在旧的db访问层中,我们必须动态创建sql语句,我们根据其他表中的信息插入表名和列名.
我还发现POCO类之间的关系有点过于以数据为中心.换句话说,我觉得我需要一个更简化的域模型来使用.也许我应该创建一个适合该法案的域模型,然后使用POCO类作为"DAO"来填充域模型类?
您将如何使用Repository模式和Unit of Work模式实现此目的?(如果这是要走的路)
c# entity-framework data-access-layer poco repository-pattern
我正在针对遗留数据库评估项目的实体框架.数据库设计得相当好,已经决定我们将使用Database-First方法.该应用程序将基于WinForms,但我想提前计划并考虑ASP.Net以及管理层可能会在某些时候请求,我想重用DAL.
现在,我了解Entity Framework为实体对象提供了几种方法:
我一直试图比较这三种方法,到目前为止我已经发现了这一点.
EntityObject T4模板是其中最丰富的.例如,它将来自实体模型的注释放在每个类和实体的每个属性之上的XMLDoc注释中,这在代码可维护性方面相当不错且有用.没有其他生成器支持这种开箱即用(虽然我知道可以修改T4模板,但它显然需要一些工作).另一方面,DbContext API更好一些.
EntityObject派生类型提供了一个事件,您可以在实体的属性更改时挂钩,这对实现业务逻辑很有用.
我知道POCO对此更自然,但每次模型更改时,T4生成器都会覆盖我的所有更改.当然,生成的POCO是部分类,但据我所知,不可能覆盖已经在部分类中定义的属性,所以我不确定如何在其中实现业务逻辑?
很多人似乎讨厌EntityObject派生类,更喜欢POCO方法,但似乎我失去了许多由EntityObjects开箱即用的有用功能,通过POCO路由.考虑到对POCO对象的普遍强烈偏好,我可能会误解某些东西,因此我的问题.
最后,哪个生成器最适合ASP.Net环境?我担心我的实体更改会被停止跟踪?自我跟踪实体在这种情况下是否更有用,或者它们是否仅具有Web服务的价值(我可能不会使用它)?
提前谢谢了.
我正在使用EF 4,POCO.任务如下:拥有一组DomainObject类型的数据,需要从数据库中获取并在断开连接模式下更新(添加,更新,删除操作).如何将更新的集合稍后推送回数据库?假设我们加载数据后没有对表进行并行更改.我知道context.SaveChanges()做了更新,但问题是如何将所有更改从有点列表中放回DbSet,或者有可能在断开模式下直接使用DbSet?谢谢!
如果我想使用实体框架4作为我的数据层,并希望将我的实体发送到另一层,无论是通过WCF还是其他机制,然后希望能够更新实体并将它们发回以进行更新/删除/插入最好使用自我跟踪实体还是poco对象?
如果可能的话,我宁愿使用POCO对象,因为如果可能的话我不想依赖其他层中的实体框架,但我不知道将POCO重新连接到上下文有多困难.
如果我有以下课程:
public class Foo()
{
public int PropertyIWantUpdated {get; set;}
public int PropertyIDontWantUpdated (get; set}
public ICollection<Bar> Bars {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
保存到我的数据库时,而不是
context.Entry(thisFoo).State = EntityState.Modified;
Run Code Online (Sandbox Code Playgroud)
我正在使用
context.Entry(thisFood).Property(tf => tf.PropertyIWantUpdated).IsModified = true;
Run Code Online (Sandbox Code Playgroud)
如何保存对Bars的更改?
entity-framework ef-code-first entity-framework-ctp5 entity-framework-4.1
我有一个关于EF和WCF的架构问题.我们正在使用Entity Framework(带有Oracle数据库)和基于WPF的GUI开发三层应用程序.GUI通过WCF与服务器通信.
我们的数据模型非常复杂(超过一百个表),有很多关系.我们目前正在使用默认的EF代码生成模板,我们在跟踪实体状态方面遇到了很多麻烦.
客户端上的用户界面也相当复杂,有时将具有超过50个对象的对象图向下发送到单个用户界面,在实体之间具有多个聚合层.能够在BLL层中轻松决定在客户端上修改了哪些对象以及新创建了哪些对象是一个重要的目标.
在两层之间管理实体和实体状态最明智的方法是什么?自我跟踪实体?这种情况下最常见的陷阱是什么?
那些在真实生产环境中使用STE的人能说出他们的经历吗?