我正在尝试使用EF6更新记录.首先找到记录,如果存在,则更新它.这是我的代码: -
var book = new Model.Book
{
BookNumber = _book.BookNumber,
BookName = _book.BookName,
BookTitle = _book.BookTitle,
};
using (var db = new MyContextDB())
{
var result = db.Books.SingleOrDefault(b => b.BookNumber == bookNumber);
if (result != null)
{
try
{
db.Books.Attach(book);
db.Entry(book).State = EntityState.Modified;
db.SaveChanges();
}
catch (Exception ex)
{
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
每次我尝试使用上面的代码更新记录时,我收到此错误: -
{System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:存储更新,插入或删除语句影响了意外的行数(0).自实体加载后,实体可能已被修改或删除.刷新ObjectStateManager entrie
我在实体框架中有一个SQL Server表,名为employ一个名为的单个键列ID.
如何使用Entity Framework从表中删除单个记录?
在具有单个字符串属性的简单引用类型的大序列中搜索Diana有一个有趣的结果.
using System;
using System.Collections.Generic;
using System.Linq;
public class Customer{
public string Name {get;set;}
}
Stopwatch watch = new Stopwatch();
const string diana = "Diana";
while (Console.ReadKey().Key != ConsoleKey.Escape)
{
//Armour with 1000k++ customers. Wow, should be a product with a great success! :)
var customers = (from i in Enumerable.Range(0, 1000000)
select new Customer
{
Name = Guid.NewGuid().ToString()
}).ToList();
customers.Insert(999000, new Customer { Name = diana }); // Putting Diana at the end :)
//1. System.Linq.Enumerable.DefaultOrFirst() …Run Code Online (Sandbox Code Playgroud) 我正在使用C#的System.Data.Sqlite 1.0.99,你可以用EF调用db.我面临选择的问题时FirstOrDefault通过Guid它回到null(但这样的GUID在数据库中存在行):
var user = context.Users.FirstOrDefault(x => x.Id == userId); //returns null
//or
var user = context.Users.Where(x => x.Id == userId).ToArray(); //returns empty array
Run Code Online (Sandbox Code Playgroud)
找到一些已知问题的信息,它已在1.0.95修复,但在1.0.97和下两个解决方案中又被破坏:
解决方案1:将连接字符串上的BinaryGUID属性设置为true:
Data Source=...;BinaryGUID=True;
Run Code Online (Sandbox Code Playgroud)
解决方案2:设置下一个环境变量(在建立连接之前):
Environment.SetEnvironmentVariable("AppendManifestToken_SQLiteProviderManifest", ";BinaryGUID=True;");
Run Code Online (Sandbox Code Playgroud)
解决方案2有效,因为(来自sqlite站点):
AppendManifestToken_SQLiteProviderManifest - 如果将此环境变量设置为[to anything],System.Data.SQLite.Linq.SQLiteProviderManifest类(以及System.Data.SQLite.EF6.SQLiteProviderManifest类)将使用它来修改将来的提供程序清单标记.将环境变量的值附加到现有提供程序清单标记(如果有).通常,为了使构造的提供者清单标记在语法上正确,环境变量值[要附加]必须以分号开头.
解决方案1对我不起作用,因为据我所知,它仅对System.Data.SQLite.Linq.SQLiteProviderManifest有影响.
问题:是否有任何解决方案可以解决此问题而不是设置环境变量?
我不知道之间的区别FirstOrDefault和SingleOrDefault.我何时应该使用第一个?何时应该使用第二个?
我有一个iQueryable,我需要知道它是否为null或没有值.
IQueryable<people> L = (from p in people
where p.lastname.Contains("y")
select p);
if (L != null && L.Count() > 0) {
return "Something";
} else {
return "NOTHING";
}
Run Code Online (Sandbox Code Playgroud)
好吧,如果你使用L.Count()它将使用更多的资源.有没有更好的办法?不使用的东西L.Count()
我最近一直在和LINQ一起工作,感谢一些StackOverflowers的帮助,我得到了这个声明:
var traceJob =
from jobDefinition in service.JobDefinitions
where jobDefinition.Id == traceGuid
select jobDefinition;
if (traceJob != null && traceJob.Count() == 1)
{
traceJob.First().RunNow();
Console.WriteLine(traceJob.First().DisplayName + " Last Run Time: " + traceJob.First().LastRunTime);
}
Run Code Online (Sandbox Code Playgroud)
但是,我感到很困惑,因为使它工作的那块是if(traceJob.Count() ==1).如果我删除该部分,那么我会收到一个ObjectNullRef错误,指出枚举traceJob没有产生任何结果.
现在,据我所知,if检查计数的语句实际上不应该改变Linq语句的结果吗?任何人都可以向我解释为什么我会看到这种行为?
在我的项目中,我们使用EF Code First(v.6.0.0.0)和MS SQL Server 2012.
我已将实体框架更新到第6版.奇怪的是,在更新后的某个时刻,我开始通过主键过滤记录时获得重复的项目.
首先,我开始在以下代码中获取"Sequence包含多个元素"异常
var cateringService = context.CateringServices
.SingleOrDefault(x => x.Id == query.CateringServiceId)
Run Code Online (Sandbox Code Playgroud)
我检查了数据库和参数 - 这Id是一个主键,它被标记为唯一,参数是有效的.由于Id在映射中设置为主键:
this.HasKey(x => x.Id);
Run Code Online (Sandbox Code Playgroud)
我已经用FirstOrDefault代码取代了调用,并且代码运行良好.我试图使用以下代码检索谓词的所有项目:
var cateringServices = context.CateringServices
.Where(x => x.Id == query.CateringServiceId)
.ToList();
Run Code Online (Sandbox Code Playgroud)
似乎我得到了'CateringService'实体的13个实例引用了同一行.请查看附带的截图:

我也开始A relationship multiplicity constraint violation occurred: An EntityReference can have no more than one related object, but the query returned more than one related object.通过实体引用访问CateringService实体时获得异常.我们正在使用惰性方法并启用延迟加载.
当尝试使用Include("CateringService")Everythings 尝试访问'CateringService'时,我们不能只是替换所有SingleOrDefault调用,并且此时从项目中删除所有延迟加载用法.
请指教.
UPDATE …
任何人都可以告诉我何时使用Find()和何时使用First()?如果您只是想要一个简单的查询来查找列表中的特定项目,那么一个比另一个好吗?
在关于上述和/或包括其他的方法,如果你正在寻找一个记录,且只有一个记录存在,其中之一将执行的最快?例如,我要确保,一旦发现被查询的价值,我正在寻找一个将返回它的时候了,而无需通过剩余的记录搜索.