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创建表:
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 )
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:
<?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>
另一种方法:
[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
/// <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; } } }