还是以前面使用到的那个Test.mdb为例:其中有一个表Score(学生成绩表),有三个字段:StudentID,CourseID,Mark,意思是学号为StudentID的学生在课程号为CourseID的学科考试中的得分是Mark字段的值。其实,Mark这个字段名我原来用的是Score,与数据库表的名字相同,但是这样我发现自动生成的CS文件无法通过编译,原因是Score类中有一个与类名相同的字段名。为了把问题简化,我把Score改成了Mark,但是就用Score在数据库中并没有错啊!
上面只是一种情况,特别还有数据库设计得不是很“常规”的时候,比如字段名是用空格隔开的,这样直接将字段名匹配成变量名,在编译时就会出现问题。
这时可以使用前面生成的XML文件,比如成绩表的分数字段我用的还是Score,与表名一样,我可以在XML文件中找到“Score”那个表的描述,在<Name>Score</Name>(原为<Name>Mark</Name>)下面,添加<FieldName>Mark</FieldName>,这样Score对应的变量名就会映射为Mark。不过,我们需要从这个修改后的XML文件导入数据库架构信息,并再次生成CS或者DLL文件。
导入XML文件的代码非常简单,大致像下面这样:
XmlDocument doc = new XmlDocument();
doc.Load(xmlFilePath);
DataBase database = new DataBase();
database.ConfigXmlNode = doc.DocumentElement;
这里不需要再指定数据库的连接,XML文件中就已经描述了该信息,然后重新生成即可。重新生成的代码大致如下:
CodeBuilder.BuildDBEntityCode(database, saveFilePath); //生成CS文件
或
CodeBuilder.BuildDBEntityAssembly(database, saveFilePath); //生成DLL文件
除了自定义实体的类名、成员名外,还可以使用XML文件记录“附加外键表字段”后的实体类信息。例如在MSSQL中(Access中也可以定义主外键关系)定义了主外键关系StudentID、CourseID,可为Score实体附加其外键表中的字段:如StudentName、Sex、Age、CourseName等。附加的操作由额外编写代码完成,如:
DataBaseTable dbt = database.GetTable("Score");
dbt.AttachColumn("Student", " StudentName ", "studentName"); //附加后的成员名studentName
dbt.AttachColumn("Course", "CourseName", "courseName"); //附加后的成员名courseName
这样附加后生成的实体类Score将有5个字段,在查询时,DA会自动生成联合查询的SQL语句,而且对新的Score对象所作的修改提交到数据库时,不会影响到外键表。