2011-03-14 114 views
1

我想让你了解这个问题点:建议对于实体框架数据访问层

我写的使用实体框架和通用classes.because使用C#中的交易数据访问层是不太最佳实践: Issue with System.Transactions,SqlConnection and Timeout

我想使用Linq To Entities编写我的select语句,但是在存储过程中(因为它必须处于与其他语句的事务中)的其他语句,比如“INSERT,DELETE,UPDATE,...”在数据访问层。

好吗?它与分层不一致吗?任何人都可以演示一些文章吗?

非常感谢

回答

2

您可以使用实体框架编写整个数据访问层。对于交易,您可以使用EF上下文。如果有单个数据库,这将自动为您管理交易。

using(var context = new YourDataContext()) 
{ 
    //use context for CRUD operation 
    Entity1 entity1 = context.Entities1.Where(e1 => e1.Id == 1); 
    entity1.Prop1 = "New Value"; 

    context.Entities2.Add(entity2) 

    context.SaveChanges(); 
} 

是否有任何理由不想使用EF插入/更新/删除?

+0

是因为如果我有更新stetement使用INSERT语句这两个语句不执行作为事务 – Arian 2011-03-14 21:28:13

+0

@Nima:请看看我的更新。您可以在上下文中一起执行更新/插入。 – Amitabh 2011-03-14 21:42:03

+0

+1 @Amitabh是正确的,更新和插入如图所示将在事务中运行 - 'context.SaveChanges()'在内部使用事务 - 只需要'TransactionScope'等等,如果您需要跨越多个事务数据库上下文或包含其他资源。 – BrokenGlass 2011-03-14 21:48:06

1

我想写使用LINQ to在存储 过程实体,但其他 的语句,如 “INSERT,DELETE,UPDATE,...”(我的select语句 ,因为它必须在 交易与一些其他 语句)并在数据 访问层中调用它们。

您可以使用TransactionScope与EF一起使用。这将允许您在EF的顶部添加将被兑现的交易(环境交易)。

using (TransactionScope transaction = new TransactionScope()) 
{ 
    //your EF query here 
    using(var context = new EFContext()) 
    { } 
} 
+0

恐怕也许TransactionScope有这样的错误:http://weblogs.asp.net/ryangaraygay/archive/2008/04/14/issue-with-system-transactions-sqlconnection-and-timeout.aspx我的系统有很多交易必须是交易 – Arian 2011-03-14 21:31:35

+0

@Nima:我以前使用过TransactionScope,但没有发现任何错误。我想你可以放弃它。 – Amitabh 2011-03-14 21:54:09

0

您可以使用function imports执行存储过程。那么您可以明显地将所有的事务逻辑包含在这些存储过程中。我喜欢实体框架,但也有一些和你一样的担忧。函数导入是我完成大部分事务处理和复杂逻辑的方式。

你的代码看起来像这样(以简化的方式)......

using (var context = new YourContext()) 
{ 
    context.ExecuteProcToRunTransaction("parameter 1", "parameter 2"); 
}