返回首页

至五
最近我们开始使用S#ARP建筑,一个大项目,对于那些谁不知道它是什么,你可以去网站()和只读,但在精神,它是一个开放源码使用NHibernate的ASP.NET MVC框架的建筑基础。
这种结构的以下原则是领域驱动设计的重点,松耦合,预配置的基础设施和开放介绍,这意味着这些原则,在头脑域和用户的遭遇部分正在开发的应用程序开发人员可以集中精力。
说,我们用这个开源的架构,以充分利用其原则,现在我们在第一阶段的项目,我们正在建设的领域层,在这里我们定义所有需要的实体。如果你有一个大的数据库,这将是一项乏味的任务映射表和列到类,所以我创建了一个TSQL脚本来生成这些实体,使我,Äôll只需复制并粘贴输出到一个cs文件,并准备去。

DECLARE @TableName varchar(200)

DECLARE @ProjectName varchar(200) = '<<<YourApplicationName>>>.Domain'

DECLARE @DataType varchar(200)

DECLARE @ColumnName varchar(200)

DECLARE @IsNullable varchar(200)

DECLARE @AppDataType varchar(200) = 'String'

DECLARE @ConstraintType varchar(200) 

DECLARE @ReferringTable varchar(200) 



DECLARE ClassGenerator CURSOR



--Get all Tables

FOR SELECT TABLE_NAME from <<<YourDatabaseName>>>.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_NAME

OPEN ClassGenerator

FETCH NEXT FROM ClassGenerator

INTO @TableName



PRINT 'namespace ' + @ProjectName

PRINT '{'

PRINT ' using System;'

PRINT ' using SharpArch.Domain.DomainModel;'



WHILE @@FETCH_STATUS = 0

BEGIN 



		PRINT ' public class ' + dbo.Singularize(@TableName) + ' : Entity'

		PRINT ' {'



		DECLARE EntityGenerator CURSOR

		FOR 



		--Get all columns and their key types from all the tables

		SELECT 

		COL.COLUMN_NAME, 

		COL.IS_NULLABLE, 

		COL.DATA_TYPE, 

		CST.CONSTRAINT_TYPE,

		KCU.TABLE_NAME AS REFERENTIAL_TABLE_SOURCE

		FROM 

		INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU

		INNER JOIN 

		INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RCN

		ON KCU.CONSTRAINT_NAME = RCN.UNIQUE_CONSTRAINT_NAME 

		RIGHT OUTER JOIN 

		INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU2

		INNER JOIN 

		INFORMATION_SCHEMA.TABLE_CONSTRAINTS CST

		ON KCU2.CONSTRAINT_NAME = CST.CONSTRAINT_NAME 

		AND KCU2.TABLE_NAME = CST.TABLE_NAME 

		ON RCN.CONSTRAINT_NAME = KCU2.CONSTRAINT_NAME 

		RIGHT OUTER JOIN 

		INFORMATION_SCHEMA.COLUMNS COL

		ON KCU2.TABLE_NAME = COL.TABLE_NAME 

		AND KCU2.COLUMN_NAME = COL.COLUMN_NAME

		WHERE 

		COL.TABLE_NAME = @TableName

		ORDER BY 

		COL.TABLE_NAME



		OPEN EntityGenerator

		FETCH NEXT FROM EntityGenerator

		INTO @ColumnName, @IsNullable, @DataType, @ConstraintType, @ReferringTable



		WHILE @@FETCH_STATUS = 0

		BEGIN 



			IF @ConstraintType <> 'PRIMARY KEY' OR @ConstraintType IS NULL

			BEGIN

				IF @ConstraintType = 'FOREIGN KEY'

				BEGIN

					PRINT ' public virtual ' + dbo.Singularize(@ReferringTable) + ' '  + dbo.Singularize(@ReferringTable) + ' { get; set; }' 

				END

				ELSE

				BEGIN



					--SQL to .NET Data Type Mapping

					IF @DataType = 'bigint' BEGIN SET @AppDataType = 'Int64' END

					IF @DataType = 'binary' BEGIN SET @AppDataType = 'Byte[]' END

					IF @DataType = 'bit' BEGIN SET @AppDataType = 'Boolean' END

					IF @DataType = 'char' BEGIN SET @AppDataType = 'String' END

					IF @DataType = 'date' BEGIN SET @AppDataType = 'DateTime' END

					IF @DataType = 'datetime' BEGIN SET @AppDataType = 'DateTime' END

					IF @DataType = 'datetimeoffset' BEGIN SET @AppDataType = 'DateTimeOffset' END

					IF @DataType = 'decimal' BEGIN SET @AppDataType = 'decimal' END

					IF @DataType = 'float' BEGIN SET @AppDataType = 'Double' END

					IF @DataType = 'image' BEGIN SET @AppDataType = 'Byte[]' END

					IF @DataType = 'int' BEGIN SET @AppDataType = 'Int32' END

					IF @DataType = 'money' BEGIN SET @AppDataType = 'Decimal' END

					IF @DataType = 'nchar' BEGIN SET @AppDataType = 'String' END

					IF @DataType = 'ntext' BEGIN SET @AppDataType = 'String' END

					IF @DataType = 'numeric' BEGIN SET @AppDataType = 'Decimal' END

					IF @DataType = 'nvarchar' BEGIN SET @AppDataType = 'String' END

					IF @DataType = 'real' BEGIN SET @AppDataType = 'Single' END

					IF @DataType = 'rowversion' BEGIN SET @AppDataType = 'Byte[]' END

					IF @DataType = 'smalldatetime' BEGIN SET @AppDataType = 'DateTime' END

					IF @DataType = 'smallint' BEGIN SET @AppDataType = 'Int16' END

					IF @DataType = 'smallmoney' BEGIN SET @AppDataType = 'Decimal' END

					IF @DataType = 'sql_variant' BEGIN SET @AppDataType = 'Object' END

					IF @DataType = 'text' BEGIN SET @AppDataType = 'String' END

					IF @DataType = 'time' BEGIN SET @AppDataType = 'TimeSpan' END

					IF @DataType = 'timestamp' BEGIN SET @AppDataType = 'Byte[]' END

					IF @DataType = 'tinyint' BEGIN SET @AppDataType = 'Byte' END

					IF @DataType = 'uniqueidentifier' BEGIN SET @AppDataType = 'Guid' END

					IF @DataType = 'varbinary' BEGIN SET @AppDataType = 'Byte[]' END

					IF @DataType = 'varchar' BEGIN SET @AppDataType = 'String' END

					IF @DataType = 'xml' BEGIN SET @AppDataType = 'Xml' END



					IF @IsNullable = 'YES' AND @AppDataType <> 'Byte[]' AND @AppDataType <> 'String'

					BEGIN 

						PRINT ' public virtual ' + @AppDataType + '? ' + @ColumnName + ' { get; set; }'

					END

					ELSE

					BEGIN

						PRINT ' public virtual ' + @AppDataType + ' ' + @ColumnName + ' { get; set; }'

					END

				END

			END

			FETCH NEXT FROM EntityGenerator

			INTO @ColumnName, @IsNullable, @DataType, @ConstraintType, @ReferringTable



		END

		CLOSE EntityGenerator

		DEALLOCATE EntityGenerator



	PRINT ' }'



	FETCH NEXT FROM ClassGenerator



INTO @TableName

END

PRINT '}'

CLOSE ClassGenerator

DEALLOCATE ClassGenerator

,现在我不会注意到,AOT它是清洁的创建在不同的类文件中的每个实体?因此,我创建了一个控制台应用程序做实体分隔每个文件。这里是代码:{C}
现在让我们来剖析代码,如果你注意到我使用Singularize功能以Singularize表名称我已经发布了,你可以在这里找到的代码{A1的}{A}
,AOS现在让我们去查询,你会发现有一个复杂的,我们如何让我们的关于我们的数据结构,可以很容易地从信息架构中提取的数据,如果您还有什么其他项目可以加入从中提取的读取{A3的}
一旦我们有我们需要的数据,我们开始处理它,AOS不是那么简单,但它很容易,你需要做的是收集信息的列或字段是否可为空,使我们可以作为nullabe声明在代码。我们还需要一个NET数据类型到SQL数据类型的映射。因此,如果条件。
此外,由于我们使用S#ARP建筑有一个PrimaryKeys公约",所以我们不要,AOT需要声明它,因为它是由的,根据NHibernateMaps \公约PrimaryKeyConvention类处理,所以如果你命名你的PK正确的前缀与ID,那么这将是容易的,但你总是可以覆盖它,如果你想。下面是处理它的代码
{S0的}
namespace CI5.Infrastructure.NHibernateMaps.Conventions

{

    #region Using Directives



    using FluentNHibernate.Conventions;



    #endregion



    public class PrimaryKeyConvention : IIdConvention

    {

        public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance)

        {

            instance.Column(instance.EntityType.Name + "Id");

        }

    }

}

最后,我们需要注意外键的表是什么我们不,AOT声明ID,AOS在实体,但它关系到的类,因此,我们此行的相关。{体C3}
以外,其他一切应该很简单。
上面的代码仅生成基本的东西,所以如果你已经添加了验证和其他实体线路不使用它,否则,我希望这会使某人的生活更轻松。
| raymund的Macaalay:迈克尔优惠:良好的工作

回答