Entity Framework3.5 关于外键表的一些经验
来源:互联网 发布:淘宝衣服缩水美女视频 编辑:程序博客网 时间:2024/06/06 02:26
Entity Framework3.5 关于外键表的一些经验
自从MVC3 RTM版本发布以来,我一直对Mv3c非常感兴趣,尤其是新发布的Entity Framework Code-First以来,我就被它深深地吸引,一句话真的很好用。
但是,最近接到一个项目,要求使用万网的虚拟主机,无奈虚拟主机不支持.Net Framework4,所以只好采用.Net Framework3.5了,那么数据访问技术自然也就只能用Entity Framework3.5了,但是在开发中还是遇到了一些不大不小的问题,下面将我所遇到的问题及解决方法记录下来,以备后查,如果能够帮助大家那就再好不过了。
一、问题数据背景
数据库有两张表分别是Role(权限表)和User(用户表),它们的关系为一对多,即一个权限对应多个用户。
数据库关系图,如下所示:
EDM图如下所示:
一、Repeater控件绑定外键表的问题及解决方法
我要实现的是在Repeater中显示所有的用户及其权限名称。
Default.aspx.cs代码:
protected
void
Page_Load(
object
sender, EventArgs e)
{
if
(!IsPostBack)
{
Repeater1.DataSource =
new
MZLDataBaseModel.MZLDataBaseEntities().Users;
Repeater1.DataBind();
}
}
Default.aspx代码:
<asp:Repeater ID=
"Repeater1"
runat=
"server"
>
<ItemTemplate>
<div>
<div><%# (Container.DataItem
as
MZLDataBaseModel.User).UserName %></div>
<div><%# (Container.DataItem
as
MZLDataBaseModel.User).Role.DisplayName%></div>
</div>
</ItemTemplate>
</asp:Repeater>
Ctrl+F5运行后,错误提示显示的是Role对象为空,这就意味着User对象的Role对象没有值,没办法网上搜索解决方案吧,可是搜索的结果基本上都是查询时生成一个将User和Role属性合并到一起的一个新对象,然后再Repeater中使用Eval(“PropertyName”)的形式进行数据绑定,这样就可以实现我们的需求了。
可是这种动不动就要定义实体对象的方法实在是太笨拙了,要是一个大项目的话那岂不是要定义N多个实体对象啊,而且还要手动输入PropertyName总感觉很别扭。
回头来继续想想之前的那个错误,错误的关键在于user对象没有包含Role对象,所以我就尝试Include(“Role”),结果问题搞定了,完整代码如下:
protected
void
Page_Load(
object
sender, EventArgs e)
{
if
(!IsPostBack)
{
Repeater1.DataSource =
new
MZLDataBaseModel.MZLDataBaseEntities().Users.Include(
"Role"
);
Repeater1.DataBind();
}
}
Include方法的作用就是在查询User的时候将Role对象预加载进来,这是User的Role对象就有值了,我们也就可以调用User的Role对象了。
二、删除Role对象
代码如下:
protected
void
Button1_Click(
object
sender, EventArgs e)
{
var
roleid = 4;
using
(MZLDataBaseModel.MZLDataBaseEntities db =
new
MZLDataBaseModel.MZLDataBaseEntities())
{
Role role = db.Roles.First(r => r.ID == roleid);
db.DeleteObject(role);
db.SaveChanges();
}
}
不出意料出现错误提示,大概意思就是数据库的外键约束问题,也就是说由于User表和Role表存在主外键的约束,所以单独删除Role对象未引发数据逻辑错误。
解决方法,代码如下:
protected
void
Button1_Click(
object
sender, EventArgs e)
{
var
roleid = 4;
using
(MZLDataBaseModel.MZLDataBaseEntities db =
new
MZLDataBaseModel.MZLDataBaseEntities())
{
Role role = db.Roles.Include(
"User"
).First(r => r.ID == roleid);
List<User> users = role.User.ToList();
foreach
(
var
user
in
users)
{
db.DeleteObject(user);
}
db.DeleteObject(role);
db.SaveChanges();
}
}
改代码在查询Role的同时别忘记使用Include预加载User对象否则会报错,然后我们先删除Role对象中的所有User对象,最后删除Role对象。
如果我们不执行下面代码
foreach
(
var
user
in
users)
{
db.DeleteObject(user);
}
那么Role表对应的User表中的记录并没有被删除,只是该表中的RoleID字段被设置为Null而已。
以上就是我所遇到的问题和解决方法,希望对大家能有所帮助。
» 下一篇:LINQ to Entities 不识别方法的解决方案
评论:
我想你没有仔细看内容
protected void Button1_Click(object sender, EventArgs e)
{
var roleid = 4;
using (MZLDataBaseModel.MZLDataBaseEntities db = new MZLDataBaseModel.MZLDataBaseEntities())
{
Role role = db.Roles.Include("User").First(r => r.ID == roleid);
List<User> users = role.User.ToList();
foreach (var user in users)
{
db.DeleteObject(user);
}
db.DeleteObject(role);
db.SaveChanges();
}
}
上面的这段代码就能把role删掉。
如果我们不执行下面代码
foreach (var user in users)
{
db.DeleteObject(user);
}
那么Role表对应的User表中的记录并没有被删除,只是该表中的RoleID字段被设置为Null而已。
而上面那句话的意思是强调db.DeleteObject(user); 重要性的
我的意思是首先得允许外键列可以为空哈.然后再使用你的删除方法.
如果外键列不可以空,并且不执行foreach代码的话,就会出错哈.
- Entity Framework3.5 关于外键表的一些经验
- Entity Framework3.5 关于外键表的一些经验
- 关于.NET FrameWork3.0的一些知识
- 关于.NET FrameWork3.0的一些知识
- 关于Win7下.net Framework3.5的安装
- 关于分页的一些经验。
- 关于MFC的一些经验。
- 关于Canvas的一些经验
- 关于Bean\Entity\Model\POJO的一些个人理解
- 参考资料:关于windows server 2003 x64的.net Framework3.5 的安装
- 关于java的一些基础知识和经验
- 关于打印页面的一些经验
- 关于GEF-HelloWorld的一些经验
- 关于自动开关机的一些经验
- 关于GRIDVIEW的一些小经验
- 关于W3C CSS标准的一些经验
- 关于做硬件的一些经验
- 关于嵌入开发(WinCE)的一些经验
- HTTP请求的八种方式
- 搭建scala的开发环境
- MSP430G2253 产生占空比可调的PWM
- 括号配对问题
- 媒体查询
- Entity Framework3.5 关于外键表的一些经验
- codeforces 896A Nephren gives a riddle dfs搜索
- sshpass的安装使用
- 使用PostGIS 2.0 Shapefile and DBF Loader Exporter工具导入shp文件
- accelerated 2-5-4
- 【java基础】09.内部类(InnerClass)
- 怎样设定目标系列总结
- js让input输入框只能输入数字
- 【勤哲应用】用勤哲Excel服务器做质量管理ERP系统
我想问一下关于删除Role对象.
开始你删除出错了,是因为没有Include("User")表,而后面只要Include("User")后,就能删除了,只是RoleID被设置为NULL而已,是这样吧.
也就是外键关系被去掉了,而不是真正删除了.
前提是RoleID可以为NULL?