我尝试在 Oracle 10g 上的 Entity Framework 中使用存储库模式。我简化了我的代码:
这是SQL代码:
-- Create table
create table TESTTABLE
(
MODULE_UNIQUE_ID VARCHAR2(32) not null,
PANEL_STATUS VARCHAR2(8) not null
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table TESTTABLE
add constraint TESTTABLE_PK_01 unique (MODULE_UNIQUE_ID)
using index
tablespace SYSTEM
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
我创建了简单的存储库类:
public interface IRepository<TEntity, TCtx>
{
TCtx Session { get;}
void Add(TEntity entity);
void AddOrAttach(TEntity entity);
void Delete(TEntity entity);
int Save();
TEntity SelectByKey(string colName, string key);
}
public class Repository<TEntity, TCtx> : IRepository<TEntity, TCtx>,
IDisposable
where TEntity : EntityObject
where TCtx : ObjectContext
{
#region Private fields
private TCtx _ctx;
private string _keyProperty = "ID";
public int Save()
{
return _ctx.SaveChanges();
}
public TEntity SelectByKey(string colName, string key)
{
KeyProperty = colName;
// First we define the parameter that we are going to use the clause.
var xParam = Expression.Parameter(typeof(TEntity), typeof(TEntity).Name);
MemberExpression leftExpr = Expression.Property(xParam, KeyProperty);
Expression rightExpr = Expression.Constant(key);
BinaryExpression binaryExpr = Expression.Equal(leftExpr, rightExpr);
//Create Lambda Expression for the selection
Expression<Func<TEntity, bool>> lambdaExpr = Expression.Lambda<Func<TEntity, bool>>
(binaryExpr, new ParameterExpression[] { xParam });
//Searching ....
//IList<TEntity> resultCollection = ((IRepository<TEntity, TCtx>)this).SelectAll(new Specification<TEntity>(lambdaExpr));
//if (null != resultCollection && resultCollection.Count() > 0)
//{
// //return valid single result
// return resultCollection.First();
//}
//return null;
return ((IRepository<TEntity, TCtx>) this)
.SelectAll(new Specification<TEntity>(lambdaExpr)).FirstOrDefault();
}
public void Delete(TEntity entity)
{
_ctx.DeleteObject(entity);
}
}
问题是首先我选择了一些实体,然后我想删除。
Select 对 Oracle DB 很好。问题是更新或删除命令。
var _repo = new Repository<TESTTABLE, Entities>(
new Entities(ConfigurationManager.ConnectionStrings["Entities"]
.ConnectionString));
var obj = _repo.SelectByKey("MODULE_UNIQUE_ID", "11111");
_repo.Delete(obj);
_repo.Save();
我得到这个异常(exception):
内部异常:
堆栈跟踪:
我再次测试了我的存储库类 MS SQL 数据库,它运行良好。
什么会导致这个问题?
最佳答案
我记得看到过这样的事情:
_context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
MSDN 笔记 http://msdn.microsoft.com/en-us/library/system.data.objects.objectstatemanager.aspx
相关帖子 ObjectContext tracking changes in Entity Framwwork
出于性能原因,您可以在没有更改跟踪的情况下加载对象
关于entity-framework - Entity Framework - 在 Oracle 10g 中删除实体 { 由于对象的当前状态,操作无效},我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8036037/