表结构:
CREATE TABLE [dbo].[T_USER]
(
[CID] [char](36) NOT NULL,
[NAME] [varchar](50) NULL,
[DPT_CID] [char](36) NOT NULL //部门表外键
)
删除数据的代码:
//CID是T_User的主键,PK是传过来的参数
T_USER efEntity = new T_USER() { CID = PK };
Db.T_USER.Attach(efEntity);
//这句报错(未将对象引用设置到对象的实例)
Db.T_USER.DeleteObject(efEntity);
Db.SaveChanges();
为毛不能直接根据主键删除呢
你试试通过主键查询后再删除
我勒个擦,村长亲自回复啊~~受精中
先查询再删除肯定是可以的,但是这样先查出来然后再删除,是不是有性能上影响
@多啦A梦的弟弟:
你用的是哪个版本的EF?
试试:
Db.Attach(efEntity);
Db.DeleteObject(efEntity);
Db.SaveChanges();
@dudu: 我用的是vs2010+sp1自带的entity framework,用你写的代码也是不行,在Db.Attach(efEntity)这句话出错,错误信息:无法将具有 null EntityKey 值的对象附加到对象上下文,我猜还是外键的问题,经过我的测试,外键只要不是null就可以正确删除,EF的删除这样有点别扭的感觉
唉,小弟, 错误信息:无法将具有 null EntityKey 值的对象附加到对象上下文,这句话的明显意思就是你的主键是null, 你怎么又扯到外键去了。Db是ObjectContext吧。建议不要用ObjectContext, 直接用DbContext。
主键不是null,我调试的时候已经想到这点了,确实是因为外键的问题,你可以自己建表试试,为什么不要用objectcontext,我是用的database first,vs自动生成的代码
@多啦A梦的弟弟: 我只用DbContext, Code First。你试试用过DbContext 之后,就会扔掉ObjectContext了。其他的我不会。自动生成的代码,如果没有搞懂,我是不敢用的。你有外键的情况下,删除的数据正确吗? 能不能检查一下生成的sql语句,我用DbContext没问题的。
@ChatinCode: 因为我们做的东西需要支持ORACLE,但是ORACLE的官方提供程序不支持code first,所以我只能用database first,他自动生成的代码也就是一些实体类,DbConetxt也是继承与ObjectContext的吧