Tag: entity framework

在某些情况下,OptimisticConcurrencyException在entity framework中不起作用

更新(2010-12-21):根据我一直在做的测试完全重写了这个问题。 此外,这曾经是一个POCO特定的问题,但事实certificate我的问题不一定是POCO特定的。 我正在使用entity framework,我的数据库表中有一个时间戳列,应该用于跟踪乐观并发的更改。 我已将实体设计器中此属性的并发模式设置为“已修复”,并且我得到的结果不一致。 以下是一些简化的场景,它们演示了并发检查在一个场景中工作但在另一个场景中不起作用。 成功抛出OptimisticConcurrencyException: 如果我附加一个断开连接的实体,那么如果存在时间戳冲突,SaveChanges将抛出一个OptimisticConcurrencyException: [HttpPost] public ActionResult Index(Person person) { _context.People.Attach(person); var state = _context.ObjectStateManager.GetObjectStateEntry(person); state.ChangeState(System.Data.EntityState.Modified); _context.SaveChanges(); return RedirectToAction(“Index”); } 不抛出OptimisticConcurrencyException: 另一方面,如果我从数据库中检索我的实体的新副本,并对某些字段进行部分更新,然后调用SaveChanges(),那么即使存在时间戳冲突,我也不会得到OptimisticConcurrencyException : [HttpPost] public ActionResult Index(Person person) { var currentPerson = _context.People.Where(x => x.Id == person.Id).First(); currentPerson.Name = person.Name; // currentPerson.VerColm == [0,0,0,0,0,0,15,167] // person.VerColm == [0,0,0,0,0,0,15,166] currentPerson.VerColm = person.VerColm; […]

EF代码优先:如何在跟踪DDD时从实体的Collection中删除一行?

所以这是场景: DDD声明您使用存储库来获取聚合根,然后使用它来添加/删除它拥有的任何集合。 添加很简单,您可以在要添加的Collection上简单地调用.Add(Item item) 。 保存时,会在数据库中添加一个新行。 但是,删除是不同的 – 调用.Remove(Item item)不会从数据库中删除该项,它只是删除外键。 所以,虽然,是的,它在技术上不再是集合的一部分,它仍然在数据库中。 阅读,唯一的解决方案是使用数据上下文删除它。 但根据DDD,域对象不应该知道数据上下文,因此删除必须在域外进行。 什么是正确的方法? 或者让数据库中的孤儿可以接受(也许是运行例程来清除它们)?

是否可以将linq的reflection用于实体?

我试图通过创建一个扩展方法来一般地处理过滤来清理我的代码。 这是我想要清理的代码。 var queryResult = (from r in dc.Retailers select r); if (!string.IsNullOrEmpty(firstName)) queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(firstName.Trim(), ex.FirstName.Trim()) > 0); if (!string.IsNullOrEmpty(lastName)) queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(lastName.Trim(), ex.LastName.Trim()) > 0); if (!string.IsNullOrEmpty(companyName)) queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(companyName.Trim(), ex.CompanyName.Trim()) > 0); if (!string.IsNullOrEmpty(phone)) queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(phone.Trim(), ex.Phone.Trim()) > 0); if (!string.IsNullOrEmpty(email)) queryResult = […]

MVC 5 IoC和身份validation

我即将开始一个项目,我将使用MVC5。 但是,由于我想使用IoC并稍后重用我的用户表,并向其添加自定义内容,我发现很难看到我如何使用MVC5附带的新Identity框架。 我越来越关注基本forms的认证。 你有什么解决方案? 我的需求: 必须注入用户存储库/服务 用户存储库必须驻留在DAL中 用户存储库必须能够支持除EF之外的其他技术 使用OpenID和OAuth进行身份validation必须要轻松实现 必须安全 应该可以在其他项目中重复使用,例如。 WPF 我一直在寻找答案,但我看到的一切都是在控制器中硬编码的。 你是怎么解决的? 您是从头开始编写的,还是可以绑定到可以扩展到其他.NET平台的东西,如WCF和WPF? 以下代码直接来自默认ASP.NET MVC 5模板中的AccountController。 它首先做的是Bastard Injection 。 [Authorize] public class AccountController : Controller { public AccountController() : this( new UserManager( new UserStore( new ApplicationDbContext()))) { } public AccountController(UserManager userManager) { UserManager = userManager; } } 接受的答案将交给那个人,它向我展示他们所做的事情,其中​​包含了上述要求

在表达式树中使用可空类型

我有一个扩展方法,使用字符串值动态过滤Linq到实体结果。 它工作正常,直到我用它来过滤可空列。 这是我的代码: public static IOrderedQueryable OrderingHelperWhere(this IQueryable source, string columnName, object value) { ParameterExpression table = Expression.Parameter(typeof(T), “”); Expression column = Expression.PropertyOrField(table, columnName); Expression where = Expression.GreaterThanOrEqual(column, Expression.Constant(value)); Expression lambda = Expression.Lambda(where, new ParameterExpression[] { table }); Type[] exprArgTypes = { source.ElementType }; MethodCallExpression methodCall = Expression.Call(typeof(Queryable), “Where”, exprArgTypes, source.Expression, lambda); return (IOrderedQueryable)source.Provider.CreateQuery(methodCall); } […]

entity framework6.1.1禁用模型兼容性检查

将EF更新到版本6.1.1后,我遇到以下错误: EntityFramework.dll中发生了未处理的“System.InvalidOperationException”类型exception 附加信息:自创建数据库以来,支持TvstContext上下文的模型已更改。 请考虑使用“代码优先迁移”来更新数据库( http://go.microsoft.com/fwlink/?LinkId=238269 )。 我们可以在这个问题中描述过去解决这个问题: EF CTP5中的modelBuilder.IncludeMetadataInDatabase在哪里? 但是,我似乎无法摆脱错误。

获取entity framework6在其下面的SELECT语句中使用NOLOCK

我在MVC 5项目中使用Entity Framework 6。 如您所知,如果我们在其中使用WITH (NOLOCK) ,则SQL Server中的SELECT查询执行速度更快,效率更高。 我查看了Entity Framework 6生成的一些SQL SELECT语句,并意识到它们都不包含NOLOCK。 我不想在我的提取操作中使用事务来读取未提交的事务。 如何在下面生成的SELECT语句中强制使用EF 6来使用NOLOCK?

entity framework运行时连接字符串

我想在运行时为我的数据库提供连接字符串。 我正在使用entity framework。 这就是我到目前为止所拥有的 class MyClassDBContext:DbContext { public MyClassDBContext(string str) : base(str) { this.Database.Connection.ConnectionString = str; } } 要使用上面的代码,我试过了 //create connection string EntityConnectionStringBuilder myConn = new EntityConnectionStringBuilder(); myConn.Provider = “System.Data.SqlClient”; myConn.ProviderConnectionString = “user id=xxxx;password=xxxx;server=localhost;database=xxxx;connection timeout=30”; //inject the connection string at runtime MyClassDBContext a = new MyClassDBContext(myConn.ToString()) 上面的代码给了我一个错误,说“不支持Provider关键字”。 为了尝试调试此错误,我尝试了以下操作 MyClassDBContext a = new MyClassDBContext(“metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=user […]

使用System.Data.SQLite和Entity Framework 6的简单示例

我正在尝试使用SQLite和EF6在控制台应用程序中使用简单的代码第一个示例,但是我遇到了多个错误:我在VS 2015中创建了一个新的控制台项目。然后安装EF(6.1.3)和System。 Data.SQLite(1.0.102)通过NuGet。 尝试运行一个简单的程序: namespace SQLiteConsole1 { class Person { public int Id { get; set; } public string Name { get; set; } } class MyContext : DbContext { public DbSet Persons { get; set; } } class Program { static void Main(string[] args) { using (var db = new MyContext()) { var person […]

entity framework5代码优先不创建数据库

我正在尝试使用Entity Framework的代码优先概念创建一个新数据库。 但是,在运行代码时,不会创建数据库(使用DropCreateDatabaseIfModelChanges设置),尽管代码运行正常。 当我尝试从数据库中获取内容时,我看到以下exception。 我的项目使用单独的DataAccess层进行设置,该层具有通用服务和存储库构造。 因此,我的所有实体,存储库和数据库上下文都在解决方案中的单独项目中。 我的global.asax文件包含以下代码。 Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); 这应该初始化一个新的数据库,如果它不存在,对吧? 我的数据库上下文类看起来像这样; namespace Website.DAL.Model { public class MyContext : DbContext { public IDbSet Projects { get; set; } public IDbSet Portfolios { get; set; } /// /// The constructor, we provide the connectionstring to be used to it’s base class. /// public MyContext() : base(“MyConnectionString”) { […]