发表评论
#4楼[
楼主]2006-04-04 11:07 |
@ltjabc
写程序不用源码控制可不是好习惯啊!如果觉得只读不爽,将整个目录和所有子目录文件的只读属性去掉就可。
Hierarchical DataSource 能不能给一个具体的例子?
#7楼[
楼主]2006-04-04 16:16 |
代码里面
return StrongTyped<Entity.Project>(Target).Title;
其中的 StrongTyped 的是干什么的?能不能给一下代码?
#9楼[
楼主]2006-04-05 07:27 |
@SNS
StrongTyped用于将一个弱类型强类型化,代码包括在下载包中了,定义在Framework.Web.UI.WebHelper.cs中,我这里已经公开了全部源码了,请自行调试和查看源码。
博主你好,看了上面的日志,写的很好。
我也是个博客,刚刚设立了为博网(www.vblogin.com),这是一个基于草根博客的平台,主要提供博客共享和广告管理的服务,如果你有兴趣把blog与更多的人分享或在将来在博客上放置广告,不妨现在到为博网来注册,现在注册将成为为博网的VIP博客。
有可能你对这条留言反感,如果真是这样,我深表歉意,因为我们团队没有很多钱去做广告,我们也只好选择性的浏览有趣和优秀的blog,并在上面留言来让更多的博客知道为博网。期待与你共建一个草根博客的天地,感谢你的时间阅读本留言。
#12楼[
楼主]2006-04-25 19:01 |
@海潮的博客
NBear原名Ilungasoft Framework,是主要有Teddy开发的一个基于.Net 2.0 (C# 2.0, ASP.NET 2.0)的快速开发框架。
首先感谢Teddy大公无私的精神。我是一个.Net的初学者。问Teddy兄一个比较菜的问题。用你的NBear开发框架如何编写GridView的分页程序。比如我从数据库里读取1000条记录显示,每页显示20条如何实现?不知能否给一个例子或思路?
Name Age
FF 10
AA 15
BB 30
第一页 下页 上页 最后一页
#15楼[
楼主]2006-04-27 20:24 |
@NBear使用者
你要的这个功能和用什么框架没有关系,完全可以参考msdn,GridView控件的使用,网上也有很多使用GridView的现成例子。
我理解初学者为某些看似简单功能无从下手的心情,但是,我还是建议你学会看文档,尤其是这些基本的功能。
@Teddy's Knowledge Base
谢谢
试用过程中存在的问题(Framework 1.44):
1、GetMaxID:如果是空表会出现异常;
2、在做桌面应用开发时,不能很好地与DataGridView结合,如:增加新行新纪录;
3、数据更新时比较麻烦。不知是我没用好还是怎地,您能给个Sample么?谢谢您抽空回答一下。打扰了!
不过使用这个Framework,总的来说还是比较好的——主要是在提高开发效率和降低学习曲线方面权衡得很好。而且这种开源分享和持续改进的精神值得学习!谢谢您——Teddy,我会一直支持您的!很希望能和大家交流,如果您愿意的话!我的QQ号是:22599858(请注明:NBear支持者或类似字样)
#19楼[
楼主]2006-05-10 10:47 |
@Thinkman
谢谢支持!
1、“GetMaxID:如果是空表会出现异常;”的问题我会再下一版本修复,其实只要判断一下DomainModel.LoadCreatedID中select max(id)返回值是不是BDNULL,是就用0代替DBNULL赋给KeyValues[0]。不过为什么会对空表GetMaxID呢?至少也要有记录插入才会执行它吧?
2、因为之前的主要为Web开发考虑得比较多,没有在为winform开发做很多考虑,这方面以后我也会考虑加强。
3、关于数据更新可以参考最新的一个领域层设计的示例,及新增的NBear.DomainModel类的具体实现,这些代码中包括了主要的CRUD的使用方法,包括了采用自增长主键或guid主键等多种情形。
http://teddyma.cnblogs.com/archive/2006/05/07/393057.html
另一方面,我不用QQ,你可以留下MSN,我会加你。
谢谢Teddy,我的MSN是:
weishaozhou@msn.com
我以前插入操作是这样做得,不知对不对:
public bool InsertOrganization(ref Entity.Organization __org,string __strParentCode,ref string __strError)
{
Entity.Organization accNew = __org;
bool VerifyOK = VerifyFieldsForAdd(accNew, __strParentCode, ref __strError);
if (!VerifyOK)
{
return false;
}
accNew.ID = GetNextID();
accNew.Status = true;
bool bResult = false;
DbTransaction tran = Facade.BeginTransaction();
try
{
Facade.Insert<Entity.Organization>(accNew, tran);
tran.Commit();
bResult = true;
}
catch(Exception e)
{
tran.Rollback();
throw e;
}
finally
{
Facade.CloseTransaction(tran);
}
return bResult;
}
private int GetNextID()
{
int iRtn=0;
try
{
iRtn = Facade.SelectScalar<int>("SELECT MAX(ID) FROM [Organization]");
}
catch
{
}
iRtn += 1;
return iRtn;
}
Teddy'老兄太棒了,1.80版新增的东西正是我想要得。
最近正在用你的Framework写一个企业内部用的MIS系统。
在这里对Teddy致以最高的敬意
sourceforge1.81压缩文件有错误。打不开
#26楼[
楼主]2006-06-04 14:19 |
@try
请更换sf.net上的其他下载镜像试试,有的镜像在某些地区下载时网速比较慢,会导致下载的文件错误,你时时哪个下载速度比较快的一般会比较不易出错。
我已经重新上传了一次,请稍候重新下载。
哈,大哥真是快啊。这次可以了,上次只有4M多点。感谢
我说老大,你应该是中国人吧?
既然开源,为什么不把源码痛快地给大家看看呢?
你可能会说,到SF.NET自己下去……
既然你把代码放到那里,那么想必你也经常光顾那里,
难道你没有发现下载的都是坏包吗?
要下载好几个可能才会拼一个(看似)完整的包……
哎……让更多的人受益是件好事,可是也不能苦了自家兄弟不是?
所以建议国人的开源项目还是有个国内的站点比较好……
以上发了点牢骚,还请teddy大哥海涵,实在是因为在SF.NET下载得
郁闷导致。
如果以上的说辞给你带来不好的影响,我在此表示歉意……
#29楼[
楼主]2006-06-06 14:50 |
@一汐
你的心情我能理解,为什么选择sf.net,理由如下:
1、稳定(国内站点你倒是推荐一个真正稳定的?如果有,我当然愿意考虑。如果不稳定,页面都访问不了,甚至我上传的资料给我丢失,那用户郁闷我更欲哭无泪了);
2、更专业和更大的影响力(这就更不用多说了,别人做的就是好,而且,如果国内开发者的目光只放在国内,那就不可能有什么在国外的影响力,现在的现状就是要师夷夷技,关起门来谈爱国情结没有任何意义);
3、可下载(这个作为优点你可能觉得好笑,但事实是,sf.net提供了许多镜像,你可能访问有的镜像有些慢,但总能有你访问比较稳定快速的镜像,你可以经常从那个镜像下载,但是,国内到目前为止还找不到一个稳定的提供如此多稳定镜像的协作开发站点,速度也不稳定,即便是博客园,也是有些地方访问速度慢有些地方速度快的);
下载后,看了,sample中几个例子。版本的升级,导致使用上有变化。感觉需要出个帮助文档。否则使用上有些困难。
我的项目中用到了oracle,所以我把它改成了可以用oracle。使用起来感觉还可以!但是就是查询的时候感觉功能太少,最简单的两个表的关联都没法查;也许你会说你可以直接用sql语句,但是我不这样认为,一个项目中要讲究统一,如果用法五花八门,到时维护恐怕也不方便。希望能改进,虽然不一定要像NH那样强大,但最起码简单的需求的照顾到,要不然半截的想用也用不起来。建议还是不要加那么多花哨的东西和强大的暂时用不着的功能,还是先把基础的东西完善为好。一点小小的建议! :-)
#32楼[
楼主]2006-06-16 21:42 |
@playzxg
谢谢你的建议,其实之所以没有包括复杂关联查询,是因为实际上这个持久化方案本身不映射实体关联,所以,在查询语法上就算增加对复杂关联查询的支持,它能支持的情况也会很有限。一般来讲,个人更推荐使用视图来处理关联数据。另一方面,NBear.Data.Facade.OnToMany类一定程度上提供了部分关联查询的支持。当然,将来我也会考虑简化关联查询的可能。
另一方面,不知道是否能share一下你改写的oracle支持的代码吗?
@Teddy's Knowledge Base
谢谢你的回复!
由于我的项目比较紧,所以我没去具体很深的研究源代码,因此还算不上完全可以支持ORACLE,因为中间有个公共类我是直接改的原来的代码,不过回头有时间了我会好好研究一下的。
我其实也没改多少,只不过是在原有的基础上增加了OracleDbProvider.cs,OraclePageSplit.cs,OracleStatementFactory.cs三个类,基本内容和SqlServer文件夹里的差不多,只不过在ORACLE中PARAMETER_TOKEN由原来的(@)变为了(:),而且字段名上不能再加([)和(]);连接驱动可以用微软的System.Data.OracleClient也可以用Oracle.DataAccess等。
然后Criteria.cs也按照这个原则改一下就可以了,Gateway.cs中加上相应oracle的类型和处理就OK了!
我有个疑问
Select操作是封装好了的,岂不是效率上不如自定义使用存储过程好?
#36楼[
楼主]2006-08-01 21:04 |
@Lukiya
一般来说存储过程性能自然是要稍好一些,但是经过封装的select操作和直接写sql查询一本是一致的。
另一方面,Gateway类同样也是包含对存储过程的支持的,只不过只能返回DataSet或DataReader,需要自己调用EntityFactory的方法填充返回数据到到Entity。
提两个建议:
一、代码中的注释能不能改成中文注释,或者提供中文帮助文档。
二、能不能提供一些Step By Step的Demo。
#38楼[
楼主]2006-08-03 12:03 |
@文野
谢谢你的建议,我会考虑在近期提供中文文档和step by step教程。
Teddy:你那个NBear能自己指定配置文件(有多个连接)里的某一个连接字符串进行数据库连接么?怎么弄?谢谢!
#40楼[
楼主]2006-08-07 10:25 |
感谢Teddy作的NBear ,我下了NBear最新版,按step by step作了,可是最后好像没执行实现接口的类阿。我做winform测试的。
private void button1_Click(object sender, EventArgs e)
{
ServiceInterfaces.ISysAdminUserService service = ServiceFactory.GetService<ServiceInterfaces.ISysAdminUserService>();
dataGridView1.DataSource = service.GetSysAdminUserList();
dataGridView1.AutoGenerateColumns = true;
textBox1.Text = service.GetSysAdminUserCount();
textBox2.Text = "555";
}
执行后 dataGridView1 和 textBox1.text 都是空的。
下面是接口的实现类
using System;
using System.Collections.Generic;
using System.Text;
namespace ServiceImpls
{
public class SysAdminUserServiceImpls : ServiceInterfaces.ISysAdminUserService
{
public Entities.SysAdminUser[] GetSysAdminUserList()
{
return Gateways.Js.SelectAll<Entities.SysAdminUser>();
}
public string GetSysAdminUserCount()
{
return "123";
}
}
}
#42楼[
楼主]2006-08-19 14:51 |
@newbird
请先检查一下如果同样的代码,用web能否访问到,如果web访问不到,请先参考stepbystep。如果运行过程中没有抱错,但是却得不到结果,最大的可能是没有正确运行servicehost,或者服务的视线代码没有正确到servicehost中,请检查一下。
文档是英文的,看起来很吃力。
顺便问候楼主一句,你还是中国人吗?
#44楼[
楼主]2006-08-23 22:50 |
@tea
没看到文章最开始有中文用户手册的链接吗?
顺便反驳你一句,我是地地道道的,愿意接受一切文化和知识的中国人。善意的提醒一句,年轻人,说话夹杂着狭义的民族主义情感并不表明你有多中国人,只会让人觉得可笑的。
@tea
连认认真真作程序的心都没有的愤青, 英文也好中文也罢, 别指望靠贬低别人来证明自己.
#47楼[
楼主]2006-08-31 10:07 |
@raininwind
其实所有的ORM框架都会有类似的地方。
和gentle相比:
1、实体的attribute格式方面确实是比较类似的,不过他的实体使用class定义,而NBear采用interface定义,因此更简洁。
2、gentle目前的版本似乎还是.net 1.1的,而NBear是基于.net 2.0的,采用了大量的.net2.0高级特性。
3、获取和保存实体方面,NBear通过Gateway和ActiveEntity提供了非常灵活的基于操作符重载的强类型范型查询语法。
4、NBear提供了多种元数据配置方法,可以将元数据设置放到配置文件,gentle还向只能通过attribute设置。
5、NBear提供了可视化工具用于设置元数据,生成代码,生成数据库创建脚本等,gentle似乎没有提供那么多。
6、NBear还不仅是一个持久化框架,他还包括了分布式开发,Ajax开发等方面的各种组件支持。
。。。
不一样的地方还是比较多的,建议参照范例体验一下。
#48楼[
楼主]2006-09-05 14:31 |
@数据绑定者
能不能说明一下什么情况下出的错?能重现错误我才能查原因啊~~
这个是我点错了,选的ACCESS却选成了SQL的生成.
老大,我看了帮助,也看了您的代码,我想问一下,是否我用这个工具就能生成我所有的表个视图的代码?
直接帖到类里面就可以了是吧?
PS:老大把那两个图删了吧,影响不好,俺又删不掉.
#50楼[
楼主]2006-09-05 15:35 |
@数据绑定者
是的,把代码粘贴过去就行了。
大概看了一下,提点想法,架构在enterpriseLib上做了些扩展,总体还行, 下面有些不完成之处供参考!
1. 用IEntity范型接口和实体工厂来代替实体类, 用过注册来增加方法,使实体类的管理维护很不灵活,代码远不如实体类直观和有可读性.通常都是ORM,这里变成IRM了, :).
2. 如改用DBHelper后为支持不同数据库,拼带参的CommandText很麻烦,代码写出来不会很优美. 这里对不同数据库的比较操作符,尤其是在拼where子句时,有些地方需要buildComlunName等,有些地方不能加(会出错),维护起来麻烦;
3.不支持OutParam(如insert时只能读int整返回的值)和Merge(用select返回代实现);
4. 不支持多主键表,
5. 不能区分主键与自动增长,计算字段等.
为支持就同数据库等如果要用view转的话,如全部数据库操作改用storeProcedure差别就不大了,反正都要面临把view或sp在不同数据库间导换,只是数量大小的问题,革命不彻底
#53楼[
楼主]2006-09-13 11:53 |
@ejzhouhua@163.com
谢谢你的评论。
1、接口有些地方有优势,但在某些地方确实没有普通的类灵活,这个确实是一个矛盾。
2、可能你的版本比较旧,新版本现在支持基于操作符重载的强类型查询,不会再有拼凑sql的问题了。
3、目前对sp增加了返回参数支持了。
4、多主键和单主键一样是支持的。
5、主键与自动增长,计算字段现在是通过字段是否只读来判断的,对于一个映射到table的entity,如果字段只读表示它是一个自动增长/自动赋值字段,否则,就认为是一个可读写字段。
感觉你看的版本还是旧了点,很多问题在新版本中都有改进了。
不过还是要感谢提了那么多建议和意见。
1. IEntity范型实现不敢用,主要考虑到代码的维护和可读性,不希望系统移交时,程序员要先熟悉NBear搞懂实体对象的来龙去脉.感觉还是一表或视图对应一个类比较好,好看,好加,易懂,灵活.
2. EntityGen.exe产生的代码是分不出聚蔟索引与主键,产生的代码都一样.
3. 基于以上原因,不考虑用Entity范型,用enterprizeLib方式这果产生如下问题:
a. 不同数据库操作符重载没实现。
b. 不用sp无法支持返回参数, 用这个主要是为了跨数据库,不为跨数据库一般不会这么扎腾的了,用sp会为不同数据库移植带来诸多麻烦,有sp的话还不如数据库操作都在sp里做算了(微软好像鼓励这样做),但这样跨数据库移植工作量大的去了.
c. 这时又不支持多主键和区分主键与聚簇索引了.
d. 这时拼where是很麻烦的, update t t.a=@a, b=@b where a=@a时出现两个@a参数还要处理.
e.只测了增,删,改,没有具体用,实用的话估计还会出些问题,hehe.
用这个聚代enterprizeLib是不错的,除了扩展的不错外,还基本实现了access,oracle的database操作. 赞
#55楼[
楼主]2006-09-17 23:52 |
@ejzhouhua@163.com
谢谢你那么详细的测试!
对于跨数据库操作符,继承关系等的支持确实现在还不够强,不过考虑到大多数系统不会有太复杂的跨数据库的紧耦合,所以我想还是能适应很多没有这种需求的常见系统。当然,这方面我也会努力加强。
DBHelper与Gateway没有得到当前执行的command与connection的接口,从而无法关闭现有连接,别指望command.ExecuteReader(CommandBehavior.CloseConnection)能起作用.
不防用.net的threadPool enqueue几个ExecuteReader(cmd)操作,用sql事件探查器,比较监测一下前后的数据库连接数. 寒!!
版本已到2.几了, 诸多基本问题没有解决, 让人好生失望!
#57楼[
楼主]2006-10-07 11:10 |
@ejzhouhua@163.com
建议测试一下最新的版本。
虽然目前是2.0,但实际上,初始版本为2.0是因为将原来并不成熟的基于.net 1.1的1.X版升级到.net2.0的缘故。实际上,框架还是在beta阶段,有些问题还是在测试和不断修正中的。
你说的这个连接不能关闭的问题在之前的版本(相信比你测试的版本新)已经使用显式的connection.close代替并解决了。
#58楼[
楼主]2006-10-08 13:04 |
@Teddy's Knowledge Base
另一方面,ADO.NET默认对数据库连接是有连接池的,打开的连接close时不会立即关闭的,你可以在connectionstring中添加pooling=false选项再作一次测试,这时connection才真正会被关闭。
两者都行了,DataReader的问题在最近版本用dic<dr, com>解决了.
ADO.NET默认对数据库连接是有连接池的,即使不在任何地方调用close在.net2.0的DbProvider方式下,sp_connection_close也会经常被连接池来调用管理数据库连接,基本不存在关闭连接的问题.
但connPool处理是有时延的,如果我在多线程中并发ExecuteReader,连接池中的conn会很快长到几百后也所有数据库访问阻塞死.threadPool中加ExecuteReader出来效果了. :(
一个人做有些疏漏是难免的,什么东西也不可能一蹴而就,过程和积累很重要.等不忙了,或可以帮你写点东东,可不忙对我是个奢望.
#60楼[
楼主]2006-10-09 13:34 |
@ejzhouhua@163.com
谢谢你的支持,在v2.4.1中尝试使用dic<dr, com>解决reader的问题,结果发现,使用这种方式反而会使得连接不能立即释放,因此在v2.4.2中有重新作了调整。目前在高并发情况下实测证明不会有数据连接爆增爆满的情况了。
我也希望NBear能够由更多人一起进行开发,一个人弄有时确实很辛苦,但是目前还没有想到好的合作开发模式,希望能多听听大家的意见。
@Teddy
NBear Configuration 工具在载入程序集时弹出异常提示对话框,内容与您的flash演示1.3 的情况一样。但我重新编译程序还是报这个错。
请问这个问题能否解决呢?
请问能否提供您的 email ,我发截图和源码给您看看呢?
谢谢~
#63楼[
楼主]2006-10-14 10:05 |
@Stephen Wong
你把实体源码发给我看看吧,我想最可能的应该还是你编译的时候使用的NBear.Common.dll和Configurator.exe以来的文件版本不一致;或者就是你的实体代码还依赖外部dll,外部dll没有复制到configurator.exe所在的目录。
我的email: shijie.ma [at] gmail.com
@Teddy
换成最新的 2.4.8 就没问题了。有点奇怪...
谢谢!^_^
@Teddy
呵呵...的确如你所说,是我当时引用的 NBear.Common.dll (v2.4.2)与Configuration Tool 的版本 v2.4.4 不匹配
#67楼[
楼主]2006-10-20 11:06 |
NBear目前还只支持第一种。
那还是比较郁闷的,因为在实际项目中会有非常多的这种关系在设计里体现,如果用NBear的话还是会变成表映射,似乎只是跟DAAB比就是由framework生成了一部分的SQL而已,而不能达到真正的ORM的要求。这样子的话就会导致在考虑使用NBear框架的时候要在设计的时候作更多的考虑了。
#69楼[
楼主]2006-10-21 09:11 |
@阿飞.NET[匿名]
我完全同意完整的ORM对于描述有复杂关联关系的对象是有意义的。但是,实践中,他也会带来一定程度的复杂性,并且使性能和开发维护的效率大打折扣。因此,NBear从一开始就取了一个折中的方案,希望能兼顾各方的好处。你可以发现,因为NBear舍弃了这部分的复杂性,使得它极以上手(无需任何复杂的配置文件设置)。
我的数据库与web应用不在一台服务器上,在进行数据库操作时,读取数据没有问题。保存数据时出错。
该事务管理器已经禁止了它对远程/网络事务的支持。
[COMException (0x8004d024): 该事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D024)]
[TransactionManagerCommunicationException: 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。]
是web应用服务器不支持远程事务还是DataProvider不支持?
因为是租用虚拟主机,如果在不修改服务器设置的情况下,怎么解决这个问题呢?
#71楼[
楼主]2006-11-06 11:58 |
@luoliang
跨服务器的分布式事务需要两边的服务器都开启MSDTC支持,你的虚拟主机肯定是不会允许DTC的。
我试过了,不使用NBear,直接建SqlConnection,连远程数据库可以进行读写操作,而且可以在代码中使用事务。
所以与服务器设置无关,应该是NBear中事务的处理方法问题。
#73楼[
楼主]2006-11-06 12:54 |
可以贴出你的代码吗?NBear内部使用标准的.net事务处理方式,不应该和自定义代码有不同。我觉得可能是你自己直接通过SqlConnection的代码并不是采用NBear方式的等价代码,尤其是,你的自定义的代码可能没有用到分布式事务。
代码是这样的:
SqlConnection conn = new SqlConnection("Server=192.168.100.1;Database=tempdb;Uid=sa;Pwd=pwd");
conn.Open();
SqlTransaction st = conn.BeginTransaction();
SqlCommand cmd = new SqlCommand("insert into t select getdate()", conn);
cmd.Transaction = st;
cmd.ExecuteNonQuery();
st.Commit();
conn.Close();
如果是因为分布式事务的原因,那怎么在NBear里屏蔽分布式事务的使用?
#75楼[
楼主]2006-11-06 13:22 |
@luoliang
不需要屏蔽,你可以在使用NBear的时候,显式地使用Gateway.BeginTransaction()来开始事务,并且在事务结束的时候,使用Gateway.CloseTRansaction()关闭事务。并且,在所有的写操作时,比如,Save时,传递这个tran。如果不是用这种方式的事务,默认情况下,NBear会使用System.Transactions命名空间下的类,即使是简单的Save,也会在内部有这种事务。TransactionScope类,会检测服务器是否支持DTC,所以就抱错了。你使用传统的tran,NBear就不会使用TransactionScope了,你就可以一样的使用。
写代码很久了,学习开发模式之中,大家有什么好的建议.可以给我发信.
huangying100@tom.com
@Teddy's Knowledge Base
现在好了,谢谢你!
再次请教一个问题
我有两个对象,产品分类invclass和产品inv,每一个inv属于一个invclass分类
Entitis如下设计
public interface invclass : Entity
{
[PrimaryKey]
int ID { get; }
string Name { get; set; }
int Order_ID { get; set; }
}
public interface inv : Entity
{
[PrimaryKey]
int ID { get; }
string Name { get; set; }
int Order_ID { get; set; }
[RelationKey(typeof(invclass), "ID")]
int Invclass_ID { get; set; }
[Query(Where="{ID} = @Invclass_ID", LazyLoad=true)]
invclass InvClass { get; set; }
}
因为示例里面没有这种关系,不知道这样设计对不对,自己感觉有点别扭。
inv和invclass的映射关系是不是应该再分个对象出来,就像示例里的UserGroup,但是又感觉没有必要。
到底该怎么进行设计呢?请指教,谢谢!
#79楼[
楼主]2006-11-06 14:42 |
@luoliang
提问建议发到nbear的google group讨论组,可以直接发邮件到:nbeargroup(at)googlegroups.com。留言在这里不太好。
关于你的问题:
如果你的产品只可能包含在一个分类下,那么分类和产品就是典型的1对多关联。可以如下设计实体:
public interface invclass : Entity
{
[PrimaryKey]
int ID { get; }
string Name { get; set; }
int Order_ID { get; set; }
}
public interface inv : Entity
{
[PrimaryKey]
int ID { get; }
string Name { get; set; }
int Order_ID { get; set; }
int Invclass_ID { get; set; }
[Query(Where="{ID} = @Invclass_ID", LazyLoad=true)]
invclass InvClass { get; set; }
}
“[RelationKey(typeof(invclass), "ID")] ”这句是多余的。只有多对多关联时需要对UserGroup这种关联实体的属性设置RelationKey,对于1对1和1对多是不需要的。
有个问题,在DbToEntityDesign工具中的代码有一段,取数据表主键字段的,以下是sqlserver数据库部分:
if (radioSql.Checked)
{
int tableid = Gateway.Default.SelectScalar<int>("select id from sysobjects where [name] = @name", new object[] { name });
DataSet ds = Gateway.Default.SelectDataSet("select syscolumns.name from sysindexkeys inner join syscolumns on sysindexkeys.id = syscolumns.id and syscolumns.colid = sysindexkeys.colid where sysindexkeys.indid = 1 and sysindexkeys.id = @id", new object[] { tableid });
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
if (ds.Tables[0].Rows[i][0].ToString() == column)
{
return true;
}
}
}
前面取tableid的语句严谨一点应该加个条件:
select id from sysobjects where xtype = 'U' and [name] = @name
后面取主键字段的则不正确,改为:
select a.name
FROM syscolumns a
inner join sysobjects d
on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
where (SELECT count(*)
FROM sysobjects
WHERE (name in
(SELECT name
FROM sysindexes
WHERE (id = a.id) AND (indid in
(SELECT indid
FROM sysindexkeys
WHERE (id = a.id) AND (colid in
(SELECT colid
FROM syscolumns
WHERE (id = a.id) AND (name = a.name))))))) AND
(xtype = 'PK'))>0 and d.id = @id
其它数据库我没有去验证.
#82楼[
楼主]2006-11-07 21:40 |
@lvchaoin[匿名]
多谢指点,我会注意修改。
一个小问题,NBear.Tools.EntityDesignToEntity中Form1.cs代码line 52
if (typeof(NBear.Common.Design.Entity).IsAssignableFrom(type) && typeof(NBear.Common.Design.Entity) != type)
前面似乎少了一个符号“!”,应该是
if (!typeof(NBear.Common.Design.Entity).IsAssignableFrom(type) && typeof(NBear.Common.Design.Entity) != type)
#84楼[
楼主]2006-11-07 22:47 |
@lvchaoin[匿名]
没有少问号,这里的意思是如果type是Entity的子类,但不是Entity本身。
你加个问号,意思就不对了。
那为什么要这么判断啊?msdn上的解释是
Type.IsAssignableFrom 方法
确定当前的 Type 的实例是否可以从指定 Type 的实例分配。
为什么不能从NBear.Common.Design.Entity上分配呢?
我调试的断点处:
type = {Name = "DEPARTMENT" FullName = "PermissionSystem.Designs.DEPARTMENT"}
这个时候typeof(NBear.Common.Design.Entity).IsAssignableFrom(type)返回的值为false,就没有办法生成类和xml文件了
正在学习Nbear,请多指教!:)
#86楼[
楼主]2006-11-07 23:05 |
@lvchaoin
所有的EntityDesigns必须从Entity继承!!如果你的实体设计接口不从Entity继承,就不会被包含在生成的实体和配置文件中。
意思明白,接口我也是实现了的,就是不出正确的结果,前后两台机器上运行都出现类似情况!可能是什么原因,请指点一下。
晕了,明天继续,祝晚安!:)
#88楼[
楼主]2006-11-07 23:22 |
@lvchaoin[匿名]
如果你引用的是dist中的NBear.Common.Design.dll,则你必须使用dist中的EntityDesignToEntity.exe,不能使用源码中的EntityDesignToEntity来打开。因为,NBear是强名称签名的,每次编译会输出不同的版本。你从源码运行的EntityDesignToEntity版本比dist的版本新,他会认为是两个版本。也就是说,他认为你的接口实现的Entity接口,不是新版本的Entity接口。
这样讨论是不是有些费劲?
能不能想个办法找块地方建个讨论组之类的?
不好意思,刚提交完就发现已经有个google group =.=!
V3.1.5示例代码ORM_Adv_Tutoria中
(1)使用Batch Delete 没能删除Contained表;
(2)使用gateway.BatchDelete<LocalUser>()方法无法删除一对多关系的表,即示例ORM_Adv_Tutoria中的LocalUserPhone表;
(3)使用gateway.BatchUpdate<LocalUser>()和gateway.BatchDelete<LocalUser>()方法传递Translation参数时无效;
请Teddy留意一下
#93楼[
楼主]2006-11-13 14:59 |
@tloner
谢谢报告这些bug,我会将它们放进待修复列表。
本来跟着微软跑就很累,NBEAR更新这么快,跟着它跑,更累了。感觉项目中用NBEAR的话,系统可能会依赖于NBEAR的特定版本,而不能使用新版本。
建议减少稳定版本的发布(如3-4个月一次)。
增加测试版本的发布。
@playzxg
晕 兄弟 传上来看看 我们这边也用的是 oracle 数据库
--引用--------------------------------------------------
luoliang: @Teddy's Knowledge Base
<br>
<br>现在好了,谢谢你!
--------------------------------------------------------
你好,欢迎到我的站去交流下:http://www.rosegirl.cn baidu
你好,欢迎到我的站去交流下:http://www.rosegirl.cn google
你好,欢迎到我的站去交流下:http://www.rosegirl.cn testing