Entity Framework3.5 关于外键表的一些经验

Entity Framework3.5 关于外键表的一些经验

自从MVC3 RTM版本发布以来,我一直对Mv3c非常感兴趣,尤其是新发布的Entity Framework Code-First以来,我就被它深深地吸引,一句话真的很好用。

但是,最近接到一个项目,要求使用万网的虚拟主机,无奈虚拟主机不支持.Net Framework4,所以只好采用.Net Framework3.5了,那么数据访问技术自然也就只能用Entity Framework3.5了,但是在开发中还是遇到了一些不大不小的问题,下面将我所遇到的问题及解决方法记录下来,以备后查,如果能够帮助大家那就再好不过了。

一、问题数据背景

数据库有两张表分别是Role(权限表)和User(用户表),它们的关系为一对多,即一个权限对应多个用户。

数据库关系图,如下所示:

数据关系图

EDM图如下所示:

edmJPG

一、Repeater控件绑定外键表的问题及解决方法

我要实现的是在Repeater中显示所有的用户及其权限名称。

Default.aspx.cs代码:

3
4
5
6
7
8
9
10
protected  void  Page_Load( object  sender, EventArgs e)
     {
         if  (!IsPostBack)
         {
             Repeater1.DataSource = new  MZLDataBaseModel.MZLDataBaseEntities().Users;
             Repeater1.DataBind();
         }
     }

Default.aspx代码:

3
4
5
6
7
8
9
10
<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”),结果问题搞定了,完整代码如下:

3
4
5
6
7
8
9
10
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对象

代码如下:

3
4
5
6
7
8
9
10
11
12
13
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对象未引发数据逻辑错误。

解决方法,代码如下:

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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();
         }
     }
3
改代码在查询Role的同时别忘记使用Include预加载User对象否则会报错,然后我们先删除Role对象中的所有User对象,最后删除Role对象。
3
如果我们不执行下面代码
3
4
5
6
foreach  ( var  user in  users)
             {
                 db.DeleteObject(user);
             }
3
那么Role表对应的User表中的记录并没有被删除,只是该表中的RoleID字段被设置为Null而已。
3
以上就是我所遇到的问题和解决方法,希望对大家能有所帮助。
分类:  Asp.net
标签:  ASP.NET
1
0
« 上一篇: 浅谈在asp.net mvc3中使用IValidatableObject接口实现Model数据验证
» 下一篇: LINQ to Entities 不识别方法的解决方案
posted on  2011-02-18 22:25  卜俊生 阅读( 2637) 评论( 3编辑  收藏

评论:
#1楼   2013-06-05 15:01 |  晴空万里i   
你好 看了你的经验很有帮助.
我想问一下关于删除Role对象.
开始你删除出错了,是因为没有Include("User")表,而后面只要Include("User")后,就能删除了,只是RoleID被设置为NULL而已,是这样吧.
也就是外键关系被去掉了,而不是真正删除了.
前提是RoleID可以为NULL?
  
#2楼 [ 楼主2013-06-05 15:55 |  卜俊生   
@ 晴空万里i
我想你没有仔细看内容
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); 重要性的
  
#3楼   2013-06-05 18:11 |  晴空万里i   
mark 我明白了.
我的意思是首先得允许外键列可以为空哈.然后再使用你的删除方法.
如果外键列不可以空,并且不执行foreach代码的话,就会出错哈.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值