使用实体框架4.1代码优先于模型/数据库优先使用EDMX图表有什么优缺点?
我正在尝试完全理解使用EF 4.1构建数据访问层的所有方法.我正在使用Repository模式和IoC
.
我知道我可以使用代码优先方法:手动定义我的实体和上下文并用于ModelBuilder
微调模式.
我还可以创建一个EDMX
图表并选择一个代码生成步骤,该步骤使用T4模板生成相同的POCO
类.
在这两种情况下,我最终POCO
都得到了ORM
不可知的对象和源自的上下文DbContext
.
数据库优先似乎最吸引人,因为我可以在企业管理器中设计数据库,快速同步模型并使用设计器对其进行微调.
那么这两种方法有什么区别?是仅仅关于VS2010与企业管理器的偏好?
entity-framework poco ef-code-first entity-framework-4.1 ef-database-first
POCO =普通旧CLR(或更好:类)对象
DTO =数据传输对象
在这篇文章中有一点不同,但坦率地说,我读到的大多数博客都以DTO的定义方式描述了POCO:DTO是用于在应用程序层之间移动数据的简单数据容器.
POCO和DTO是一回事吗?
我已经编程了一段时间并且之前使用过LINQ-To-SQL和LINQ-To-Entities(尽管在使用实体时它已经处于实体/表1-1关系 - 即与L2SQL没有太大区别)
我一直在阅读有关控制反转,工作单元,POCO和存储库模式的大量阅读,并希望在我的新应用程序中使用此方法.
我正在努力的是为EF4寻找一个清晰,简明的初学者指南,该指南不承担EF1的知识.
我需要回答的具体问题是:
代码优先/型号第一?关于EF4的优点/缺点(即如果我先编码,在以后更改代码并需要重新生成我的数据库模型会发生什么 - 数据是否会被保留,转换或丢弃?)
假设我要进行代码优先(我想看看EF4如何将其转换为数据库模式)我该如何实际开始?我经常看到有实体图表的文章说"所以这是我的实体模型,现在我要去..." - 不幸的是,我不清楚他们是否在设计师中创建了模型,将其保存到生成代码然后停止任何进一步的自动代码生成 - 或 - 他们编码(POCO)?类和不知何故将它们导入到deisgner视图中?
我想我真正需要的是理解"魔法"来自何处,以及如果我不是直接从DB生成EF模型,如何自己添加它.
我知道这个问题有点模糊,但我不知道我不知道 - 所以任何输入/更正/澄清都会受到赞赏.
毋庸置疑,我不希望有人坐在这里教我EF - 我只是喜欢一些好的教程/论坛/博客/等.对于完整的实体新手
实体框架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的标签有关系.
顺便说一句:我认为同一个问题发生在一对多的关系上(谷歌和我的同事这么说).我会在家里尝试一下,但即使这样做对我的应用程序中的六个多对多关系没有帮助:(.
每次我开始研究一个新项目时,我都会和自己进行一场心理辩论,而我正在设计我的POCO.我看过很多教程/代码示例似乎都支持外键关联:
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; } // <-- Customer ID
...
}
Run Code Online (Sandbox Code Playgroud)
与独立协会相反:
public class Order
{
public int ID { get; set; }
public Customer Customer { get; set; } // <-- Customer object
...
}
Run Code Online (Sandbox Code Playgroud)
我以前使用过NHibernate,并且使用了独立的关联,它们不仅感觉更多OO,而且(延迟加载)的优势在于可以让我访问整个Customer对象,而不仅仅是ID.例如,这允许我检索Order实例,然后Order.Customer.FirstName
无需显式地进行连接,这非常方便.
所以回顾一下,我的问题是:
这是我简单的User
POCO课程:
/// <summary>
/// The User class represents a Coderwall User.
/// </summary>
public class User
{
/// <summary>
/// A User's username. eg: "sergiotapia, mrkibbles, matumbo"
/// </summary>
public string Username { get; set; }
/// <summary>
/// A User's name. eg: "Sergio Tapia, John Cosack, Lucy McMillan"
/// </summary>
public string Name { get; set; }
/// <summary>
/// A User's location. eh: "Bolivia, USA, France, Italy"
/// </summary>
public string Location { get; set; } …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用VS2010使用EF4的存储库模式.
为此,我通过右键单击实体模型设计器并单击添加代码生成项来使用POCO代码生成.然后我选择POCO模板并获取我的课程.
我希望能够做的是将我的解决方案结构化为Entity(POCO)类的单独项目以及实体模型和存储库代码的另一个项目.
这意味着我的MVC项目可以将POCO类用于强类型视图等,而不必知道存储库或必须引用它.
要将它们全部插入,我将有另一个带接口的独立项目并使用IoC.
听起来不错我只是不知道如何将类生成到自己的项目中!我可以复制它们,然后更改它们的名称空间,但我想在每次更改数据库中的模式并希望更新我的模型时避免手动工作.
谢谢
.net code-generation entity-framework poco repository-pattern