using (DataClasses1DataContext a = new DataClasses1DataContext())
{
}
这样写比较方便
更新时,如果表没有主键,那不会更新,也不会报错,设了主键后,重开连接,重新拖一个到Context里面
如果表的映射类不是从context里面搜出来的,而是自己new的
用context.表类.Attach(外面的类,true/false)更新
对于调用存储过程,反正多个表
一般讲,存储过程都会拖到datacontext里面,成为context里面的一个方法
如果什么都不改的话,那存储过程只会返回一个结果集,所以我们要改一下,
将DataClasses1.dbml用xml打开(MS这里做的很不好,很多人都不知道怎么用xml打开dbml文件),右选DataClasses1.dbml,选择打开方式,里面就有xml方式打开
你可以发现<function>节点,比如
<Function Name="dbo.temselect" Method="temselect" HasMultipleResults="true">
<ElementType Name="Table_11" >
<Column Name="id" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
<Column Name="a" Type="System.Int32" DbType="Int" CanBeNull="true" />
<Column Name="b" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
</ElementType>
</Function>
temselect 这个存储过程有多少结果集的话,就改一改这个xml
<Function Name="dbo.temselect" Method="temselect" HasMultipleResults="true">
<ElementType Name="Table_11" >
<Column Name="id" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
<Column Name="a" Type="System.Int32" DbType="Int" CanBeNull="true" />
<Column Name="b" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
</ElementType>
<ElementType Name="Table_22">
<Column Name="id" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
<Column Name="name" Type="System.String" DbType="NChar(10)" CanBeNull="true" />
<Column Name="age" Type="System.Int32" DbType="Int" CanBeNull="true" />
</ElementType>
</Function>
就行了,然后用
DataClasses1DataContext d = new DataClasses1DataContext();
IMultipleResults im = d.temselect();
List<Table_11> a = im.GetResult<Table_11>().ToList<Table_11>();
List<Table_22> b = im.GetResult<Table_22>().ToList<Table_22>();
获得两个数据集
下面还有一个问题,就是如果表名叫table_1,那存储过程返回的类名就不能叫table_1,如果是用select * 的话,要就涉及到结构相同的类的转换问题
现在好像没有什么好的解决方案,但一般的解决方案还是有的,可以这样做
在
<Table Name="dbo.Table_1" Member="Table_1">
<Type Name="Table_1">
<Column Modifier="Virtual" Name="id" Type="System.Int32" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
<Column Modifier="Virtual" Name="a" Type="System.Int32" DbType="Int" CanBeNull="true" />
<Column Modifier="Virtual" Name="b" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
</Type>
</Table>
把table_1的xml的列里面加个虚方法,在项目里建个partial类,让table_11 继承table_1
再把
<ElementType Name="Table_11" >
<Column Modifier="Override" Name="id" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
<Column Modifier="Override" Name="a" Type="System.Int32" DbType="Int" CanBeNull="true" />
<Column Modifier="Override" Name="b" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
</ElementType>
然后再
im.GetResult<Table_11>().ToList<Table_11>().cast一下,就可以了,不过还是很麻烦,以后争取避免吧;