csharp: NHibernate and Entity Framework (EF) (object-relational mapper)
代码生成器:
1. http://www.codesmithtools.com/
2.https://sourceforge.net/projects/mygeneration/
3. http://nmg.codeplex.com/ NHibernate Mapping Generator
https://github.com/luchen1021/NHibernateMappingGenerator
4.https://github.com/fdecaire/NHibernateMappingGenerator
http://www.mygenerationsoftware.com/templatelibrary/default.aspx
http://www.codeproject.com/Articles/629552/A-complete-guide-to-object-oriented-application-de
http://www.codeproject.com/Articles/656657/NET-Application-Framework-Spring-net-plus-ibatis-n
Nhibernate Spring.net Nhibernate architecture Castle.Net
/*
Domain:领域模型 (Model)
Entity
Mapping
Dao:持久层 (Dal)
Service:服务层(BLL)
WebSite:表示层
Common:通用类
Dao
DataAccess:用來存放實際要執行的SQL statement
Interface:用來定義DataAccess物件的介面
RowMapper:用來讓回傳的資料集合為物件型態
Domain
Interface:用來定義Domain object的屬性與行為的介面
Service
Interface:用來定義Service提供了哪些方法的介面
XML mapping, mapped classes
https://visualstudiogallery.msdn.microsoft.com/2049f26f-294a-40e0-94ca-fdd2d058217b
*/
http://www.cnblogs.com/wolf-sun/p/4068749.html
http://www.cnblogs.com/lyj/archive/2008/11/10/1330542.html
http://www.cnblogs.com/haogj/category/278985.html
http://www.oschina.net/p/nhibernate
http://www.cnblogs.com/GoodHelper/
http://springnetdemo1.googlecode.com/svn/trunk/
http://www.cnblogs.com/Leo_wl/p/5049799.html Spring.net-业务层仓储
https://dotblogs.com.tw/hatelove/archive/2009/09/17/10686.aspx
http://www.springframework.net/doc-latest/reference/html/tx-quickstart.html
https://dzone.com/articles/fluent-nhibernate-create-table
http://www.cnblogs.com/beniao/category/113253.html
https://catharsis.codeplex.com/
https://tinyerp.codeplex.com/
NHibernate 4.0
SQL创建表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | CREATE TABLE Class ( ClassId INT NOT NULL IDENTITY PRIMARY KEY , [ Name ] NVARCHAR(80) NOT NULL ) GO CREATE TABLE Student ( StudentID INT NOT NULL IDENTITY PRIMARY KEY , [ Name ] NVARCHAR(100) NOT NULL , ClassID INT NOT NULL FOREIGN KEY REFERENCES Class(ClassId) ) INSERT INTO Class([ Name ]) VALUES (N '3班' ) GO UPDATE Class SET [ Name ]=N '3班' WHERE ClassId=1 INSERT INTO Student([ Name ],ClassID) VALUES ( 'geovindu' ,1) GO |
用Mappings方便:(参数参考:https://www.devart.com/entitydeveloper/nhibernate-mapping-samples.html )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | namespace Domain.Entities { public class Class { public Class() { } public virtual int ClassId { get ; set ; } public virtual string Name { get ; set ; } public virtual IList<Student> Student { get ; set ; } } } namespace Domain.Mappings { public class ClassMap : ClassMapping<Class> { public ClassMap() { Schema( "dbo" ); Lazy( true ); Id(x => x.ClassId, map => map.Generator(Generators.Identity)); Property(x => x.Name, map => map.NotNullable( true )); //主键 Bag(x => x.Student, colmap => { colmap.Key(x => x.Column( "ClassID" )); colmap.Inverse( true ); }, map => { map.OneToMany(); }); //Bag(x => x.Student, colmap => { colmap.Key(x => x.Column("ClassID")); colmap.Inverse(true); }, map => { map.OneToMany(); }); } } } namespace Domain.Entities { public class Student { public virtual int StudentId { get ; set ; } public virtual Class Class { get ; set ; } public virtual string Name { get ; set ; } public virtual int ClassId { get ; set ; } // namespace Domain.Mappings { /// <summary> /// /// </summary> public class StudentMap : ClassMapping<Student> { public StudentMap() { Schema( "dbo" ); Lazy( true ); Id(x => x.StudentId, map => map.Generator(Generators.Identity)); Property(x => x.Name, map => map.NotNullable( true )); //外键 ManyToOne(x => x.Class, map => { map.Column( "ClassID" ); map.Cascade(Cascade.None); }); // ManyToOne(x => x.Class, map => { map.Column("ClassID"); map.Cascade(Cascade.None); }); //Bag(x => x.ClassId, x =>{x.Table("Class");x.Key(k => k.Column("ClassId"));}, x => x.OneToMany(k => k.Column("ClassId"))); //Bag(x => x.ClassId, colmap => { colmap.Key(x => x.Column("ClassID")); colmap.Inverse(true); }, map => { map.OneToMany(); }); //ManyToOne(x => x.Class, map => //{ // map.Column("ClassID"); // map.NotNullable(true); // map.Cascade(Cascade.None); //}); } } } |
老方法用XML文件:(比较麻烦)
hbm.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <? xml version="1.0" encoding="utf-8" ?> < hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain"> < class name="Class" table="T_Class" lazy="true" > < id name="ID" type="int" column="ClassID"> < generator class="native"/> </ id > < property name="Name" type="string"> < column name="Name" length="50"/> </ property > <!--一对多关系:一个客户可以有一个或者多个订单--> <!--子实体负责维护关联关系--> <!--<set name="Class" table="Class" generic="true" inverse="true" cascade="all"> <key column="ClassId" foreign-key="FK__Student__ClassID__37A5467C"></key> <one-to-many class="Domain.Class,Domain"/> </set>--> <!--<set name="Student" table="Student" generic="true" inverse="true" cascade="all"> <key column="StudentID" foreign-key="FK__Student__ClassID__37A5467C"></key> <one-to-many class="Domain.Student,Domain"/> </set>--> </ class > </ hibernate-mapping > <? xml version="1.0" encoding="utf-8" ?> < hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain"> < class name="Student" table="T_Student" lazy="true" > < id name="ID" type="int" column="StudentID"> < generator class="native"/> <!--<generator class="assigned" />--> </ id > < property name="Name" type="string"> < column name="Name" length="50"/> </ property > <!--多对一关系:Orders属于一个Customer--> <!--<many-to-one name="Class" column="ClassID" not-null="true" class="Domain.Class,Domain" foreign-key="FK__Student__ClassID__37A5467C" />--> < many-to-one name="Class" column="ClassID" cascade="all"/> </ class > </ hibernate-mapping > |
另一种方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | [NHibernate.Mapping.Attributes.Class(Table = "UserData" , NameType= typeof (User), Lazy= false )] public class User { [NHibernate.Mapping.Attributes.Id(0, TypeType = typeof ( long ), Column = "ID" , Name = "ID" )] [NHibernate.Mapping.Attributes.Generator(1, Class = "native" )] public virtual long ID { get ; set ; } [NHibernate.Mapping.Attributes.Property(Column = "UserName" )] public virtual string UserName { get ; set ; } [NHibernate.Mapping.Attributes.Property(Column = "Password" )] public virtual string Password { get ; set ; } [NHibernate.Mapping.Attributes.Property(Column = "FullName" )] public virtual string FullName { get ; set ; } [NHibernate.Mapping.Attributes.Property(Column = "Address" )] public virtual string Address { get ; set ; } [NHibernate.Mapping.Attributes.Property(Column = "Phone" )] public virtual string Phone { get ; set ; } [NHibernate.Mapping.Attributes.Property(Column = "Birthdate" )] public virtual DateTime? Birthdate { get ; set ; } [NHibernate.Mapping.Attributes.Property(Column = "Email" )] public virtual string Email { get ; set ; } [NHibernate.Mapping.Attributes.Property(Column = "IsSystemAdmin" )] public virtual bool IsSystemAdmin { get ; set ; } [NHibernate.Mapping.Attributes.ManyToOne(Column = "UserGroupID" , Fetch = FetchMode.Join, ClassType= typeof (Group), Lazy = Laziness.False)] public virtual Group Group { get ; set ; } [NHibernate.Mapping.Attributes.ManyToOne(Column = "DepartmentID" , Fetch = FetchMode.Join, ClassType = typeof (Department), Lazy = Laziness.False)] public virtual Department Department { get ; set ; } } |
NHibernate Contrib https://sourceforge.net/projects/nhcontrib/?source=navbar
NHibernate.Envers https://bitbucket.org/RogerKratz/nhibernate.envers/src/d5e34a3f31ce?at=default
NSIS: Nullsoft Scriptable Install System
Windows installer development tool
https://sourceforge.net/p/nsis/code/HEAD/tarball
https://fnhsamples.codeplex.com/SourceControl/latest
https://code.google.com/p/nhibernate-repository-example/
https://github.com/jagregory/fluent-nhibernate
https://sourceforge.net/projects/nhibernate/files/NHibernate/
http://www.codeproject.com/Articles/21122/NHibernate-Made-Simple
http://www.c-sharpcorner.com/uploadfile/dpatra/using-nhibernate/
http://www.codeproject.com/Articles/363040/An-Introduction-to-Entity-Framework-for-Absolute-B
http://www.codeproject.com/Articles/464897/Object-Relational-Mapping-ORM-using-NHibernate-Par
https://entityframework.codeplex.com/
https://github.com/aspnet/EntityFramework
http://www.codeproject.com/Articles/26123/NHibernate-and-MySQL-A-simple-example
http://www.codeproject.com/Articles/14553/NHibernate-Helper-Kit
http://www.nhforge.org/wikis/howtonh/your-first-nhibernate-based-application.aspx
http://www.codeproject.com/Articles/17452/Eucalypto-ASP-NET-CMS-Library-using-NHibernate (SQLite,SQL Server 2005,SQL Server 2000 ,MySQL)
http://www.codeproject.com/Articles/19425/NHibernate-Templates-for-Smart-Code-Generator
http://www.codeproject.com/Articles/55174/Custom-Fluent-Nhibernate-Membership-and-Role-Provi
http://www.codeproject.com/Articles/891056/Automatic-Table-Generation-in-any-database-by-NHib
http://www.codeproject.com/Articles/380022/Simplify-Database-Operations-with-Generic-Fluent-N
http://www.codeproject.com/Articles/14072/Building-a-Middle-Tier-Component-using-NHibernate
http://wcfbyexample.codeplex.com/ patterns & practices: WCF by example
http://www.codeproject.com/Articles/9243/PostgreSQL-libpqxx-Class-Generator
http://www.codeproject.com/Articles/1043625/Triggers-Rowcount-And-NHibernate
http://www.codeproject.com/Articles/48292/Three-tier-NET-Application-Utilizing-Three-ORM-T
http://microsoft.github.io/windows/
https://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=SearchText&f%5B0%5D.Value=bing%20maps
http://cn.bing.com/dev/en-us/dev-center
http://kb.cnblogs.com/zt/ef/
http://kb.cnblogs.com/zt/nhibernate/
Entity Framework
http://learnentityframework.com/downloads/#2ed
Entity Framework
code first
http://learnentityframework.com/downloads/#cfed
Pro Entity Framework 4.0
http://www.apress.com/9781590599907?gtmf=s
Entity Framework 4.0 Recipe
http://www.apress.com/9781430227038?gtmf=s
Entity Framework 6 Recipes
http://www.apress.com/9781430257882?gtmf=s
https://fnhsamples.codeplex.com/
https://github.com/nhibernate/nhibernate-core
https://www.packtpub.com/application-development/learning-nhibernate-4
http://echarts.baidu.com/examples.html
https://github.com/ecomfe/echarts
https://github.com/idoku/EChartsSDK
https://github.com/re-motion/Relinq
https://github.com/antlr/antlr3
https://github.com/zhang-xiao-ming/Dapper.Extensions
https://github.com/lobin-z0x50/DapperExamle
https://github.com/p-kaczynski/DapperSPMap
Dapper Stored Procedure Mapper
https://github.com/somdoron/DapperLinq
https://github.com/mrzeszowski/dapper-extensions-entityframework
https://github.com/IntertechInc/DapperParameters
https://github.com/castleproject
https://github.com/nhibernate/NHibernate.Spatial
https://github.com/zuifengke/windy-ibatisnet
https://github.com/alienblog/BaseFrame spring.net,nhibernate,mvc 基础框架,三层架构扩展
简单灵活好用的数据库访问组件,比iBATIS.Net、Linq to Sql和Entity Framework好用 https://github.com/windeagle/StrongOrm
任务管理系统(ibatis框架) https://github.com/flowbywind/NewTaskSystem
Spring.NET NHibernate Northwind Reports using Aspose.Cells and Aspose.Pdf
https://code.msdn.microsoft.com/SpringNET-NHibernate-435c9f88#content
https://asposespringnet.codeplex.com/
https://www.devbridge.com/articles/entity-framework-6-vs-nhibernate-4/
Nhibernate 存储过程操作
http://www.codeproject.com/Articles/765862/Configuring-NHibernate-to-execute-a-Stored-Procedu
http://www.codeproject.com/Articles/37425/Execute-Stored-Procedure-in-SQL-Server-using-nHibe
http://www.martinwilley.com/net/code/nhibernate/sql.html
http://www.martinwilley.com/net/dotnet.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | /// <summary> /// /// </summary> public interface ITextFormatter { string FormatText( string text); string FormatSingular( string text); string FormatPlural( string text); IList< string > PrefixRemovalList { get ; set ; } } public abstract class AbstractTextFormatter : ITextFormatter { public virtual string FormatText( string text) { if ( string .IsNullOrEmpty(text)) return text; var result = RemovePrefix(text); // Cannot have class or property with not allowed chars result = result .Replace( "%" , "Porcentaje" ) //Means Percentage in spanish .Replace( "á" , "a" ) .Replace( "é" , "e" ) .Replace( "í" , "i" ) .Replace( "ó" , "o" ) .Replace( "ú" , "u" ); // Split by capitals to preserve pascal/camelcasing in original text value // Preserves TLAs. See http://stackoverflow.com/a/1098039 result = Regex.Replace(result, "((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))" , " $1" ).Trim(); // Omit any chars except letters and numbers in class or properties. result = result.Replace( " " , "_" ); result = Regex.Replace(result, "[^a-zA-Z0-9_]" , String.Empty); //And Underscore if (result.Length != 0 && char .IsNumber(result.ToCharArray(0, 1)[0])) { // Cannot start class or property with a number result = "_" + result; } return result; } public string FormatSingular( string text) { return FormatText(text).MakeSingular(); } public string FormatPlural( string text) { return FormatText(text).MakePlural(); } private string RemovePrefix( string original) { if (PrefixRemovalList == null || PrefixRemovalList.Count == 0 || string .IsNullOrEmpty(original)) return original; // Strip out the first matching prefix foreach ( var prefix in PrefixRemovalList) { if (original.ToLower().StartsWith(prefix.ToLower())) { return original.Remove(0, prefix.Length); } } return original; } public IList< string > PrefixRemovalList { get ; set ; } } public class UnformattedTextFormatter : AbstractTextFormatter { } public class CamelCaseTextFormatter : AbstractTextFormatter { public override string FormatText( string text) { return base .FormatText(text).ToCamelCase(); } } public class PascalCaseTextFormatter : AbstractTextFormatter { public override string FormatText( string text) { return base .FormatText(text).ToPascalCase(); } } public class PrefixedTextFormatter : AbstractTextFormatter { public PrefixedTextFormatter( string prefix) { Prefix = prefix; } private string Prefix { get ; set ; } public override string FormatText( string text) { return Prefix + base .FormatText(text); } } public static class TextFormatterFactory { public static ITextFormatter GetTextFormatter(ApplicationPreferences applicationPreferences) { ITextFormatter formatter; switch (applicationPreferences.FieldNamingConvention) { case FieldNamingConvention.SameAsDatabase: formatter = new UnformattedTextFormatter(); break ; case FieldNamingConvention.CamelCase: formatter = new CamelCaseTextFormatter(); break ; case FieldNamingConvention.PascalCase: formatter = new PascalCaseTextFormatter(); break ; case FieldNamingConvention.Prefixed: formatter = new PrefixedTextFormatter(applicationPreferences.Prefix); break ; default : throw new Exception( "Invalid or unsupported field naming convention." ); } formatter.PrefixRemovalList = applicationPreferences.FieldPrefixRemovalList; return formatter; } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!