我一直在探索在ASP.NET MVC3环境中编辑/更新实体框架5中的记录的不同方法,但到目前为止,它们都没有勾选我需要的所有框.我会解释原因.
我找到了三种方法,我将提到它的优点和缺点:
方法1 - 加载原始记录,更新每个属性
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
original.BusinessEntityId = updatedUser.BusinessEntityId;
original.Email = updatedUser.Email;
original.EmployeeId = updatedUser.EmployeeId;
original.Forename = updatedUser.Forename;
original.Surname = updatedUser.Surname;
original.Telephone = updatedUser.Telephone;
original.Title = updatedUser.Title;
original.Fax = updatedUser.Fax;
original.ASPNetUserId = updatedUser.ASPNetUserId;
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
优点
缺点
方法2 - 加载原始记录,设置更改的值
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
db.Entry(original).CurrentValues.SetValues(updatedUser);
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
优点
缺点
方法3 - 附加更新的记录并将状态设置为EntityState.Modified
db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
优点
我最近开始在我的.NET 4.0应用程序中使用Entity Framework 4.0,并对与池化相关的一些事情感到好奇.
据我所知,连接池由ADO.NET数据提供程序管理,在我的情况下是MS SQL服务器.当您实例化新的实体context(ObjectContext
)时,这是否适用,即无参数new MyDatabaseModelEntities()
?
a)为应用程序创建全局实体上下文(即一个静态实例)或b)使用using
块为每个给定操作/方法创建和公开实体上下文有哪些优点和缺点.
我应该了解的某些场景的任何其他建议,最佳实践或常用方法?
注意:我使用的是Entity Framework第5版
在我的通用库,我有Add
,Edit
和Delete
下面的方法:
public class EntityRepository<T> : IEntityRepository<T>
where T : class, IEntity, new() {
readonly DbContext _entitiesContext;
public EntityRepository(DbContext entitiesContext) {
if (entitiesContext == null) {
throw new ArgumentNullException("entitiesContext");
}
_entitiesContext = entitiesContext;
}
//...
public virtual void Add(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State != EntityState.Detached) {
dbEntityEntry.State = EntityState.Added;
}
else {
_entitiesContext.Set<T>().Add(entity);
}
}
public virtual void Edit(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State == …
Run Code Online (Sandbox Code Playgroud) 我有一个实体集国家,反映了数据库表'<'char(2),char(3),nvarchar(我的数据库中的50>).
我有一个解析器返回一个解析国家的Country []数组,并且正在以正确的方式更新它.我想要的是:采取一系列国家,对于那些尚未在数据库中插入它们的国家,以及那些现有的更新,如果任何字段不同.如何才能做到这一点?
void Method(object sender, DocumentLoadedEvent e)
{
var data = e.ParsedData as Country[];
using(var db = new DataContractEntities)
{
//Code missing
}
}
Run Code Online (Sandbox Code Playgroud)
我在想类似的东西
for(var c in data.Except(db.Countries)) but it wount work as it compares on wronge fields.
Run Code Online (Sandbox Code Playgroud)
希望以前有人遇到过这个问题,并为我提供解决方案.如果我不能使用Country对象并插入/更新它们的数组很容易,我不会看到使用框架的好处,因为从表演者我认为更快写一个自定义的sql脚本插入它们而不是ect检查一个国家插入前已经在数据库中?
我将override equals添加到我的国家/地区类:
public partial class Country
{
public override bool Equals(object obj)
{
if (obj is Country)
{
var country = obj as Country;
return this.CountryTreeLetter.Equals(country.CountryTreeLetter);
}
return false;
}
public override int GetHashCode()
{
int hash …
Run Code Online (Sandbox Code Playgroud) 我正在 docker 中开发一个多容器应用程序。其中一项服务是一个长时间运行的 C# 控制台应用程序,它基本上对数据库进行一些轮询并将数据发送到 e 服务器。我只是通过添加以下语句来保持服务运行:
while(true);
Run Code Online (Sandbox Code Playgroud)
现在我正在考虑将此服务更改为 .NET Core 工作服务(甚至是 windows 服务,因为我只在 windows 主机上使用 windows 容器)。我已经阅读了一些关于 worker 服务优点的文章,但是当涉及到容器化应用程序时,它们似乎都已经过时了,因为我的容器无论如何都是作为一种“后台服务”运行的(而且我每个容器/图像只使用一个服务)。所以我的问题是:
与在 docker 中运行控制台应用程序相比,在 docker 中运行核心工作服务有什么好处或缺点吗?
更新:对于“工作人员服务”,我指的是 .NET Core 3.x 中可用的新工作人员服务模板:https : //www.stevejgordon.co.uk/what-are-dotnet-worker-services
我在修改和同时添加子行时遇到了一些麻烦.I'm使用该技术从答案:stackoverflow.com/questions/5557829/....
问题出在以下代码中:
public void EditReport(tbl_inspection inspection)
{
foreach (var roll in inspection.tbl_inspection_roll)
{
container.tbl_inspection_roll.Attach(roll);
container.ObjectStateManager.ChangeObjectState(roll, (roll.id_inspection_roll == 0) ? EntityState.Added : EntityState.Modified);
}
container.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我总是至少有一行要更新.当我有1行添加时,它工作正常,问题是当我尝试同时添加多行时,显示众所周知的错误:
ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象.
感觉就像我在这里遗漏了一些东西......