潇洒的中间映射
在我的上一个问题中 表: create table [Primary] ( Id int not null, CustomerId int not null, CustomerName varchar(60) not null, Date datetime default getdate(), constraint PK_Primary primary key (Id) ) create table Secondary( PrimaryId int not null, Id int not null, Date datetime default getdate(), constraint PK_Secondary primary key (PrimaryId, Id), constraint FK_Secondary_Primary foreign key (PrimaryId) reference
0 2024-04-15
编程技术问答社区
这里的每个人都在跳ORM的马车吗?
Microsoft Linq到SQL,Entity Framework(EF)和NHIBERNATE等都将ORMS作为下一代数据映射技术提出,并且声称自己是轻量级,快速且容易的.例如,刚刚在VS杂志上发表的本文: /a> 谁都为在其项目中实施这些技术感到兴奋吗?这些技术的创新在哪里使它们在前任中如此出色? 解决方案 我多年来已经写了数据访问层,持久性组件,甚至是我自己的数百个应用程序中的ORM(我的"爱好"之一);我什至已经实施了自己的业务交易经理(在其他地方进行了讨论). ORM工具已经在其他平台上已经存在了很长时间,例如Java,Python等.现在,以Microsoft中心的团队发现了一种新的时尚.总的来说,我认为这是一件好事 - 探索和理解建筑和设计概念的必要步骤,这些概念似乎已被引入. . 底线:我总是更喜欢进行自己的数据访问,而不是与试图"帮助"我的某些工具作斗争.放弃对自己的命运的控制是永远无法接受的,数据访问是我应用程序命运的关键部分.一
0 2024-04-15
编程技术问答社区
用扩展方法中定义的查询进行单元测试
在我的项目中,我正在使用以下方法来查询数据库的数据: 使用可以返回任何类型并且不绑定到一种类型的通用存储库,即IRepository.Get而不是IRepository.Get. nhibernates ISession是这样的存储库的一个例子. 使用特定的T上使用IQueryable上的扩展方法来封装重复查询,例如 public static IQueryable ByInvoiceType(this IQueryable q, InvoiceType invoiceType) { return q.Where(x => x.InvoiceType == invoiceType); } 用法就是这样: var result = session.Query().ByInvoiceType
0 2024-04-14
编程技术问答社区
NHibernate3查询与QueryOver对比
我注意到有两种方法可以创建良好的通用友好访问nhibernate. IQueryOver query= session.QueryOver().Where(criteria); 和 IQueryable query= session.Query().Where(criteria); 每个接口的实现. IQueryOver : IQueryOver, IQueryOver 和 IQueryable : IEnumerable, IQueryable, IEnumerable iQueryable实现了IEnumerable,因此支持您期望的所有Linq友好事物.我正在倾向于此实施,但是想知道是否有人知道查询的目的是您无法完成查询? 解决方案 QueryOver结合了扩展方法和lambda表达式: IList cats =
0 2024-04-14
编程技术问答社区
将实体框架中的字符串列映射为Enum
有没有办法将字符串列映射到实体模型中的枚举? 我已经在冬眠中完成了此操作,但无法在EMF中弄清楚. 解决方案 这很丑 public virtual string StatusString { get { return Status.ToString(); } set { OrderStatus newValue; if (Enum.TryParse(value, out newValue)) { Status = newValue; } } } public virtual OrderStatus Status { get; set; } Orderstatus是枚举类型,状态是枚举器,StatusString是它的字符串版本. 其他解决方案 可能是一个更好的版本. OrderStateIdentifier字段用于JSON序列化和数据库字段, 而Orderstate仅在代码中用
0 2024-04-14
编程技术问答社区
产量如何实现懒惰加载的模式?
yield如何实现lazy loading的模式? 解决方案 收益率实施在需要之前才能达到代码. 例如,此代码: public IEnumerable GetInts() { yield return 1; yield return 2; yield return 3; } 实际上将编译成实现IEnumerable的嵌套类,GetInts()的主体将返回该类的实例. 使用反射器您可以看到: public IEnumerable GetInts() { d__6d d__d = new d__6d(-2); d__d.4__this = this; return d__d; } 编辑 - 添加有关GetInts实现的更多信息: 这种实现使其懒惰的方式基于Enumerator MoveNext() 方法.当生成枚举的嵌套类(示例中的
0 2024-04-13
编程技术问答社区
Entity Framework中是否不支持通用类作为模型?
我正在尝试这样做: public class TrackerContext : DbContext { public bool TrackNewValues { get; set; } public TrackerContext(bool trackNewValues = false) : base() { TrackNewValues = trackNewValues; } public TrackerContext(string connectinString, bool trackNewValues = false) : base(connectinString) { TrackNewValues = trackNewValues; } public DbSet> AuditLog { get; set; }
0 2024-04-13
编程技术问答社区
拥有Poco和ORM的优势是什么?
我想到的一个优势是,如果您使用POCO类进行ORM映射,则可以轻松地从一个ORM切换到另一个ORM,如果两个都支持POCO. 拥有没有POCO支持的ORM,例如映射是用dataObjects.net orm之类的属性进行的,对我而言并不是问题,与POCO支持的ORMS及其生成的代理实体一样,您必须意识到,实际上,实体实际上是绑定到某些上下文/会话的DAO对象,例如序列化是一个问题,等等. 解决方案 poco都是关于松散的耦合和可检验性. 因此,当您进行POCO时,您可以隔离测试域模型(例如您是否执行DDD).您不必为如何持续而打扰.您无需存根上下文/会话即可测试您的域. 另一个优点是漏水较少.因为持久性问题不会被推到域层.因此,您正在执行SRP原则. 我可以看到的第三个优势是,在PoCo上进行域模型更具进化性和灵活性.您可以添加与持久性相比的新功能更容易. 例如,我在执行DDD时使用POCO,但是对于某种应用程序,您不需要进行DDD(如果您正在执行基
0 2024-04-13
编程技术问答社区
Entity Framework在一对多中替换集合的正确方法
假设客户有许多电话号码,电话号码只有一个客户. public class PhoneNumber : IValueObject { public string Number {get; set;} public string Type {get; set;} } public class Customer : IEntity { public ICollection phones {get; private set;} //ew at no encapsulated collection support public void SetPhones(params PhoneNumber[] phones) { this.phones.Clear(); this.phones.AddRange(phones); } } 如果我这样做像这样的EF映射并运行它,则每次设置电话号码时,都会创建新的声词,但不
0 2024-04-13
编程技术问答社区
在DDD中拥有独立的领域模型和持久性模型
我一直在阅读有关域驱动的设计以及如何在使用代码生成数据库时实现它的方法.根据我阅读和研究的内容,关于这个问题有两种意见: 有1个类,既可以用作域模型,又是持久模型 有2个不同的类,一个实现域逻辑,另一种用于代码优先的方法 现在我知道意见1)可以简化域名和持久性模型之间没有太多差异的小解决方案,但我认为这打破了单一的责任原则,当ORM的约定干扰时,这引入了很多问题ddd. 令我惊讶的是,有许多有关如何实施意见的代码示例1).但是一个尚未找到如何实现意见2)以及如何映射两个对象的一个​​示例. (可能有这样的示例,但我找不到C#一个) 所以我试图自己实施一个示例,但我不确定这是否是这样做的好方法. 假设我有一个票务系统,门票的到期日期.我的域模型看起来像这样: /// /// Domain Model /// public class TicketEntity { public int Id { ge
0 2024-04-13
编程技术问答社区
防止在实体框架的相关表实体上添加新记录
我正在尝试在我的实体上添加新记录.它可以正常工作,问题是,相关实体也添加了新记录.是否有一种方法可以停止相关或第二级实体插入新记录? 这是我的示例实体类: public Tracking() { public string Details { get; set; } //Other properties here.. [Required] public virtual Employee { get; set; } } 基本上,我只是获取现有的员工记录,然后在我的财产上声明它,然后添加跟踪记录: Employee emp = _dbContext.EmployeeRepo.GetEmployeeByID(1001); Tracking track = new Tracking() { Details = "My details here", Employee = emp
0 2024-04-12
编程技术问答社区
orm和ADO.net之间的区别是什么?
我正在阅读一本书,它说:"如果您通过使用ado.net来创建自己的数据访问层以访问数据库,那么无论数据架构是否存在,您都会受到最小的影响.如果您是数据架构.使用O/RM,您的灵活性将受您使用的工具的限制". Ado.net和任何其他ORM之间的主要区别是什么? 解决方案 ado.net提供了对诸如SQL Server之类的数据源的一致访问 和XML,以及通过OLE DB和ODBC暴露的数据源. 数据共享的消费者应用程序可以使用ado.net连接到这些 数据源并检索,处理和更新他们的数据 包含. ado.net将数据访问从数据操作分开为离散 可以单独使用或串联使用的组件. Ado.net包括 .NET框架数据提供商用于连接到数据库,执行 命令和检索结果.这些结果要么处理 直接放置在ado.net数据集对象中以暴露 以临时方式给用户,与来自多个的数据结合 来源,或在层之间通过.数据集对象也可以使用 独立于.NET框架数据提供商来管理数据本地 到该应用程序或从XML来源.
0 2024-04-12
编程技术问答社区
实体框架 | 序列包含一个以上的匹配元素
我使用了数据库第一种方法. 该模型是正确的(或者至少看起来像) 但是我总是会遇到这个错误.拜托,我已经尝试了很多事情. 我的程序的完整代码(甚至是我创建数据库的SQL脚本) 在这里:因为我有Mac.我使用dotnet ef cli命令(dbcontext支架)创建了模型 我可以使用我的上下文.但是我无法触摸任何DBSET .. public static void Main(string[] args) { using (ApplicationContext context = new ApplicationContext()) { Console.WriteLine(context.Database.CanConnect()); var months = context.Months.ToList(); foreach (var month in months)
0 2024-04-12
编程技术问答社区
用Dapper获取作为UTC的日期时间
我正在使用Dapper将我的实体映射到SQL Server CE.如果我用Kind=Utc保存DateTime,当我回信时,我会用Kind=Unspecified获得DateTime,这会导致各种问题. 示例: var f = new Foo { Id = 42, ModificationDate = DateTime.UtcNow }; Console.WriteLine("{0} ({1})", f.ModificationDate, f.ModificationDate.Kind); connection.Execute("insert into Foo(Id, ModificationDate) values(@Id, @ModificationDate)", f); var f2 = connection.Query("select * from Foo where Id = @Id", f).Single(); Console.WriteLine("{0
0 2024-04-12
编程技术问答社区
如何在Oracle的实体框架支持下强制使用pascal案例?
Oracle的实体框架支持正在使所有班级名称上层案例和下划线. 因此,order_items表在class名称中变为order_items.但是我想将pascal案例用于班级名称. order_items ==> orderItems. 如何更改默认命名规则? 解决方案 大约2周前,我的任务是摆脱Linq Connect作为我们的数据提供商,将EF用于我们的ORM操作.好吧,所有人都知道,当Microsoft和Oracle参与其中时,事情都不会容易,因为它们并不能很好地发挥作用.精明的开发人员可以找到用于Pascal套管和多元化的解决方案,以便从Oracle数据库生成的实体符合我们的标准.我们不希望带有下划线的桌子名称出现在我们的模型上.最终提出了一个很好的解决方案,花了一点思考和发展.最终结果是操纵EDMX文件,然后运行T4模板以使魔术发生.我们的最终结果将所有实体及其特性转换为帕斯卡壳.它还将所有存储的功能转换为帕斯卡壳.收集到收集的导航属性也均一体.这是要遵循的
0 2024-04-12
编程技术问答社区
使用存储过程时,哪种ORM是最好的?
我有业务对象(开发人员写)和一些sprocs(dba写) 任何人都可以推荐一个好的对象映射器来处理这种设置. 我尝试了Codesmith和Nhibernate,并遇到了麻烦.我不介意我的ORM是免费的还是付费的. 解决方案 亚音速对Sprocs有很好的支持.它将用辅助方法包裹每个人,如果需要,您可以从结果中检索出强大的收藏或实体.我在至于基于您的DB生成类,亚音速生成部分类,因此您可以根据需要扩展它们.您也可以从亚音速生成的类到实际模型进行映射. 其他解决方案 免责声明:我是 dapper . 如果您正在寻找一个简单的对象映射器,该映射器处理映射procs to business对象 dapper 非常适合. 请记住,它没有"图形管理","身份映射"等发货.它提供了裸露的骨头,完整的解决方案,涵盖了许多其他ORMS所不存在的情况. 尽管如此,它提供了最快的物体材料之一,在某些基准测试. 微不足道: create proc spGe
0 2024-04-12
编程技术问答社区
我应该使用什么.net的ORM?
我对.NET相对较新,并且正在使用LINQ2SQL已有将近一年的时间,但是它缺少我现在想要的一些功能. 我将启动一个新项目,我想在其中使用具有以下特征的ORM: 它必须非常有生产力,我不想处理访问层以从数据库中保存或检索对象,但是它应该允许我在实际提交数据库之前轻松调整任何对象;此外,它应该允许我轻松地使用更改的数据库架构 它应该允许我扩展从数据库映射的对象,例如,向其添加虚拟属性(虚拟列到表) 它必须是(至少几乎)数据库不可知论,它应该允许我以透明的方式与不同的数据库一起工作 它必须没有太多的配置或必须基于约定才能使其正常工作 它应该允许我与Linq合作 那么,您知道我可以使用任何ORM吗?谢谢您的帮助. 编辑我知道一个选择是使用NHIBERNATE.这似乎是企业级应用程序的事实标准,但这似乎不是很有生产力,因为它的深度学习曲线.换句话说,我在此处阅读了其他一些帖子,以使其与LINQ无法很好地集成.这是真的吗? 解决方案 也许您最好的选择是使用
0 2024-04-12
编程技术问答社区
如何用Dapper ORM返回动态类型的List<dynamic>?
我已经使用dapper.net已有一段时间了,这是一个非常好的ORM映射器,可与.NET Dynamic类型一起使用. ,但我注意到,当Dapper从数据库中检索数据时,它将返回为DapperRow type. 有什么办法可以将其返回以System.Dynamic.ExpandoObject>? 等其他类型 解决方案 DapperRow对象旨在在行之间共享很多状态.例如,如果您获取40行,列名等仅存储 .如果我们使用ExpandoObject,则需要每行配置.因此,使用DapperRow作为幕后实施细节是有意的效率. 请注意,从dynamic apis返回的对象也可以以IDictionary的速度施放. 但是,我将开放支持支持该字典用法的其他类型 - 其中ExpandoObject是一种.因此,是的,它可以更改可以: var rows = conn.Query(...); 有效.它只需要代
4 2024-04-12
编程技术问答社区
使用SQLite :memory:与NHibernate的问题
我将NHIBERNATE用于我的数据系统,并且一段时间以来,我一直在使用SQLite进行本地集成测试.我一直在使用文件,但我想我会出去:内存:选项.当我启动任何集成测试时,似乎创建了数据库(Nhibrenate吐出表创建SQL),但与数据库互动会导致错误. 每个人都可以使用内存数据库工作吗?有可能吗?我正在使用的连接字符串是: Data Source=:memory:;Version=3;New=True 解决方案 只要与其连接保持打开状态,SQLite存储器数据库仅存在.将其用于NHIBERNATE的单位测试: 1.在测试开始时打开ISESSION(也许是在[设置]方法中). 2.在您的Schemaexport调用中使用该会话的连接. 3.在测试中使用同一会话. 4.在测试结束时关闭会话(也许是在[拆卸]方法中). 其他解决方案 I was able to use a SQLite in-memory database and avoid having
0 2024-04-11
编程技术问答社区
潇洒和匿名的类型
是否可以使用dapper使用匿名类型? 我可以看到如何使用动态,即 connection.Query(blah, blah, blah) 是可以做 的 .Select(p=> new { A, B ,C }) 或之后的一些变化? 编辑 我想我现在如何使用Dapper.我倾向于缓存(使用inmemorycache)数据,所以我只是在开始时进行一个大查询(使用dapper非常快速),然后我使用linq将其全部整理在我的存储库中. using System; using System.Collections.Generic; using System.Configuration; using System.Data.Common; using System.Linq; using Dapper; namespace SomeNamespace.Data { public class DapperDataContext : IDi
0 2024-04-11
编程技术问答社区