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  搞定ibatis.net双数据库访问

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;
        }
    }
}

  

posted @   ®Geovin Du Dream Park™  阅读(970)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示