使用LinqToSql加载动态column
2011-01-19 16:08
525 查看
需求
最近有个小的探索类需求:如何支持在数据库中动态的添加一列?
例如我们有一个type News
动态类型生成
本例中采用了两种动态生成类型的方式。
News –> XXXNews这个过程使用了Emit
News –> WrappedNews这个过程使用了codeDom
关于前者,有一点需要说明:
由于XXXNews以后还需要进一步包装为WrappedXXXNews,所以Emit出来的Assembly需要Save到硬盘。存在什么位置呢?我曾经使用了缺省值(Environment.CurrentDirectory),但是XXXNews –> WrappedXXXNews时报告说找不到Emit出来的Assembly(这个异常好隐蔽。。。花了我很久。。。)。于是我尝试Save到bin目录下。但是对bin目录内容的更改又会造成ASP.NET的重编译(听说。具体发生了什么求赐教),于是存到了bin2。。。我也知道这是个很雷的方案。。。在web.config中设置
关于后者,我使用了Expressions to CodeDOM,使用过程实在算不上顺手。。。求推荐更好的codedom类库。
Controller的依赖注入
园子里的刘东大人(spring.net达人)已经介绍过了使用spring.net 1.3.1对controller的注入。
我在这里说两个问题
好像还是要依赖Spring.Core的,估计刘东大把这个assembly加入了GAC?
还是不知道怎么兑Global.asax进行注入。目前只会比较丑陋的写法
接下来的路
本例中还有很多未尽事宜,例如
LambdaExpressionBinder没有完成,所以create一个list view的时候无法把用户输入的lambda表达式转为Func。这个相信用codedom也能做,只是我实在懒得弄了。
还没有实现允许用户输入ExpireAt,也懒得弄了。。。
Wrap content entity type的时候,本来应该读取对应的property,加上相应的column参数的,懒得弄了。。。
还有很多基本的地方,例如NewsProperty、NewsListView根本都没有mapping到数据库。。。。。。懒得弄了。。。
等等等等
你有多懒啊!喂!
不过有些地方不是我懒哦
比如不知道Spring.Net的ControllerFactory是怎么实现的(以后抽个时间看看),我必须要写以下三个Controller,直接在配置文件中指定泛型Controller不行。以后直接上Mvc3试试好了。
虽然如上所述,本例还有非常多的不足,不过我不会再更新了(这不是坑。。。
本来就是个技术学习性质的东西,实际应用可能性很小(比如现在大家都不会用Linq to Sql了吧)。我也真的在这个过程中学到了不少东西,这对我就足够了。
代码下载与声明
本例使用Spring.Net实现IoC和singleton
本例使用了Expressions to CodeDOM实现codedom
本例中的TypeBinder基本照抄自《Pro ASP.NET MVC 2 Framework 2nd Edition》中的实现
运行本例前请自备数据库结构如下(就一个表)
并自行修改web.config中的连接串
按F5 首先出现news list
然后请进news properties
之后Add我们需要的ExpireAt
Save成功后再次进入news,这个list不会变化,尝试进入view,就会看到ExpireAt了
最后给出本例下载
最近有个小的探索类需求:如何支持在数据库中动态的添加一列?
例如我们有一个type News
wrap private Type Wrap() { var wrapper = new ContentEntityWrapper<TEntity> { EntityPropertyRepository = EntityPropertyRepository }; var wrappedType = wrapper.Wrap(CurrentType); EntityFactory.TypeInitializers[typeof(TEntity)] = () => Activator.CreateInstance(wrappedType) as IEntity; return wrappedType; }
动态类型生成
本例中采用了两种动态生成类型的方式。
News –> XXXNews这个过程使用了Emit
News –> WrappedNews这个过程使用了codeDom
关于前者,有一点需要说明:
由于XXXNews以后还需要进一步包装为WrappedXXXNews,所以Emit出来的Assembly需要Save到硬盘。存在什么位置呢?我曾经使用了缺省值(Environment.CurrentDirectory),但是XXXNews –> WrappedXXXNews时报告说找不到Emit出来的Assembly(这个异常好隐蔽。。。花了我很久。。。)。于是我尝试Save到bin目录下。但是对bin目录内容的更改又会造成ASP.NET的重编译(听说。具体发生了什么求赐教),于是存到了bin2。。。我也知道这是个很雷的方案。。。在web.config中设置
<probing privatePath="bin;bin2"/>就可以了。
关于后者,我使用了Expressions to CodeDOM,使用过程实在算不上顺手。。。求推荐更好的codedom类库。
Controller的依赖注入
园子里的刘东大人(spring.net达人)已经介绍过了使用spring.net 1.3.1对controller的注入。
我在这里说两个问题
好像还是要依赖Spring.Core的,估计刘东大把这个assembly加入了GAC?
还是不知道怎么兑Global.asax进行注入。目前只会比较丑陋的写法
ContextRegistry.GetContext().GetObject("someObj"),而且只能在Application_Start之后使用
接下来的路
本例中还有很多未尽事宜,例如
LambdaExpressionBinder没有完成,所以create一个list view的时候无法把用户输入的lambda表达式转为Func。这个相信用codedom也能做,只是我实在懒得弄了。
还没有实现允许用户输入ExpireAt,也懒得弄了。。。
Wrap content entity type的时候,本来应该读取对应的property,加上相应的column参数的,懒得弄了。。。
还有很多基本的地方,例如NewsProperty、NewsListView根本都没有mapping到数据库。。。。。。懒得弄了。。。
等等等等
你有多懒啊!喂!
不过有些地方不是我懒哦
比如不知道Spring.Net的ControllerFactory是怎么实现的(以后抽个时间看看),我必须要写以下三个Controller,直接在配置文件中指定泛型Controller不行。以后直接上Mvc3试试好了。
NewsPropertyController
NewsListViewController
NewsController
虽然如上所述,本例还有非常多的不足,不过我不会再更新了(这不是坑。。。
本来就是个技术学习性质的东西,实际应用可能性很小(比如现在大家都不会用Linq to Sql了吧)。我也真的在这个过程中学到了不少东西,这对我就足够了。
代码下载与声明
本例使用Spring.Net实现IoC和singleton
本例使用了Expressions to CodeDOM实现codedom
本例中的TypeBinder基本照抄自《Pro ASP.NET MVC 2 Framework 2nd Edition》中的实现
运行本例前请自备数据库结构如下(就一个表)
并自行修改web.config中的连接串
按F5 首先出现news list
然后请进news properties
之后Add我们需要的ExpireAt
Save成功后再次进入news,这个list不会变化,尝试进入view,就会看到ExpireAt了
最后给出本例下载
相关文章推荐
- LINQ to SQL系列三 使用DeferredLoadingEnabled,DataLoadOption指定加载选项
- LINQ to SQL系列三 使用DeferredLoadingEnabled,DataLoadOption指定加载选项
- ADO.NET Linq To SQl与Data Entity 的使用比较
- [转]Linq to sql 实现多条件的动态查询(方法二)
- 在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测
- 摘:使用 LINQ to SQL 的 N 层应用程序和远程应用程序【已删博客】
- 使用Linq to XML加载XML文档
- VB.NET中使用Linq TO SQL添加数据后获得自增长列ID
- Linq to SQL how to do “where [column] in (list of values)”
- 使用LINQ to SQL更新数据库(下):性能测试
- Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询
- 使用 LINQ to SQL 创建模型类
- [代码]如何使用用户定义的标量值函数(LINQ to SQL)
- 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 4)
- Linq To Sql常用方法使用总结
- 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 4)
- Linq to sql 实现多条件的动态查询(方法一)
- LINQ to SQL 运行时动态构建查询条件
- 使用Linq to SQL实现基本的增、删、改、查及绑定控件(C#)
- LINQ TO SQL的使用感受