EF实体框架创建方法:
1、添加EF框架:
在工程中,先添加文件夹:DataModel(方便管理),在文件夹中再添加新项:数据--ADO.Net实体数据模型:
命名为: DataModel.edmx。并勾选“确定对象名称的单复数形式”(会创建集合和项的名称区别)。
2、数据模型文件说明:
DataModel.edmx:生成的数据模型文件包。
DataModel.Context.cs:包括模型中,所有表集合的管理类。
DataModel.tt子节点下的文件:表数据类的定义(映射)。
3、问题:
1、生成数据模型以后,很多外键,需要手动修改。--不需修改。
2、需要手动创建一些枚举变量(在模型浏览器中)。
自动生成很多Nullable<byte>变量,对于记录状态的字段,需要手动定义枚举类型。
Nullable<byte>:表示可以为空的<byte>类型字段。---不需修改。
定义枚举类型方法:----重点!
以 (任务表)中的任务状态为例:
1)点击数据库模型文件 DataModel.edmx,左侧显示数据库关系图,在关系图中任意单击,
在解决方案管理器旁边选择“模型浏览器”。
2)DataModel--实体类型中,选择xx表,右键“在关系图中显示”。在图中的字段右键“转换到枚举”,然后定义即可。
建议:但是这样定义比较麻烦,可以先自定义枚举类型,然后进行引用。
这样的好处是:1.当删除数据模型时,枚举定义还在,只需重新添加枚举类型引用即可!
2.以后修改,更加灵活。
引用方法:
勾选“引用外部类型”,添加“命名空间.枚举类型名”,并还要在“枚举类型名”上添加“枚举类型名”即可。
(此处有Bug,当枚举类型已使用过,不能再重复使用,需要重新创建并改名!)
说明:如果定义错误了,或者想修改:
1.不建议:先删除表,然后右键“从数据库更新模型”即可恢复原来的表。(杀鸡用了牛刀了)
2.建议方法:字段属性--类型,改为原来的类型,如Byte。并删除模型浏览器中对应的枚举类型。
3)然后,编译通过即可。
说明:在模型浏览器中,表右键--“表映射”,可查看字段映射后的对应类型。
注意:建议模型创建以后,只更新数据模型,如果删除数据模型,重新建立时还需要重新添加引用!!
命名空间:
DataService.DataDomain.StatusType
DataService.DataDomain.ImageType
4、数据模型的使用:
using (DataEntities entities = new DataEntities())
{
s_role item = new s_role();
item.role_id = Guid.NewGuid();
item.role_name = "管理员";
entities.s_role.Add(item);
entities.SaveChanges();
}
数据库用户:
5、常见问题:
问题1、指定的架构无效。错误:
找不到概念类型“DataModel.ChildStatusType”的对应对象层类型。
以下信息对于解决上一个错误可能很有用:
CLR 枚举类型的基础类型与 EDM 枚举类型的基础类型不匹配。
解决方法:枚举类型数据结构与DB数据类型不一致,枚举定义添加基类byte等。如下
public enum StatusType : byte
{
NoProcess = 0,
Processing,
Processed,
}
问题2、连接本地DB正确,连接远程DB报错:
由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从
ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端,或在打开每个 Microsoft .NET
Framework 3.0 SDK 文档的跟踪的同时检查服务器跟踪日志。
解决问题:在远程DB上创建访问用户并分配权限即可。