在EF 4.1+中,这两行代码之间有区别吗?
dbContext.SomeEntitySet.Add(entityInstance);
dbContext.Entry(entityInstance).State = EntityState.Added;
Run Code Online (Sandbox Code Playgroud)
或者他们做同样的事情?我想知道是否可能会影响子集合/导航属性与另一个不同.
我在WinForms项目中使用EntityFramework 5.0版,.net 4.5.
我为我创建了2个重要的实体
public class Role
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public bool StockPermission { get; set; }
public bool ItemPermission { get; set; }
public bool OrderPermission { get; set; }
public bool PersonPermission { get; set; }
public bool StatisticPermission { get; set; }
}
public class Person
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public String Name { get; set; } …Run Code Online (Sandbox Code Playgroud) 我在使用web api在asp.net中一次更新我的数据库1列时遇到此问题.我试图查询PUT只更新行中的一个值而不是更新那个值并将其余值设置为null.我在控制器之外做了一个单独的模型来接受更新,所以我可以一次做一个.当我db.Entry(user).State = EntityState.Modified;在控制器中点击该行时,它出错了.有什么建议我怎么解决这个问题?
这是我在put方法中使用的单独的ViewModel:
namespace WebAPI.Models.ViewModels
{
public class UserViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器在我的参数中使用ViewModel调用方法:
public HttpResponseMessage PutUser(int id, UserViewModel user)
{
HttpResponseMessage response;
if (db.User.IsInRole("Admin"))
{
try
{
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!UserExists(id))
{
response = new HttpResponseMessage(HttpStatusCode.NotFound);
return response;
}
else
{
throw;
}
}
response = new HttpResponseMessage(HttpStatusCode.NoContent);
return response;
}
Run Code Online (Sandbox Code Playgroud)
这是我的DBContext档案:
public partial …Run Code Online (Sandbox Code Playgroud) 我已将 Web 应用程序项目从 .NET Core 2.1 迁移到 3.1(也将 EF Core 从 2.1.1 迁移到 3.1.0)。
迁移后,一些单元测试不再工作,抛出重复键数据库异常。
我模拟了这个问题,并意识到带选项的 EF 核心UseInMemoryDatabase在 3.1 中的行为有所不同,它不会清理旧数据。
在第二种测试方法中,People表已经包含从第一个测试添加的数据,这在 2.1 中没有发生
有谁知道如何使内存数据库适用于每个单元测试?
这是我的测试代码:
AppDbContext.cs
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;
namespace MyConsoleApp.Database
{
public class AppDbContext: DbContext
{
protected AppDbContext(DbContextOptions options) : base(options) { }
public AppDbContext(DbContextOptions<AppDbContext> options) : this((DbContextOptions)options)
{
}
public virtual DbSet<Person> Person { get; set; }
}
public class Person
{
[Key]
public int Id { …Run Code Online (Sandbox Code Playgroud) c# unit-testing dbcontext entity-framework-core .net-core-3.1
我在我的 DBContext 中使用了“HasConversion”来定义一个 JSonArray(语言/值)并将它保存为一个文本字段,它的作用就像一个魅力,我在我的解决方案中添加了一个新项目,没有任何改变,但后来我得到了添加有关“设置值比较器”的迁移的新错误。
我的模型是这样的:
public class Brand
{
public int Id { get; set; }
public new IList<LangValue> Name { get; set; } = new List<LangValue>();
}
Run Code Online (Sandbox Code Playgroud)
和DBContext就像:
modelBuilder.Entity<Brand>(t =>
{
t.Property(p => p.Name).HasConversion(
v => JsonConvert.SerializeObject(v, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include}),
v => JsonConvert.DeserializeObject<IList<LangValue>>(v, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include})
);
});
Run Code Online (Sandbox Code Playgroud)
它运行良好,但在添加新项目后,我在添加迁移时出现黄色错误,并且模型未添加到新数据库中。
Microsoft.EntityFrameworkCore.Model.Validation[10620] 实体类型“品牌”上的属性“名称”是具有值转换器但没有值比较器的集合或枚举类型。设置值比较器以确保正确比较集合/枚举元素。
data-conversion dbcontext asp.net-core jsonconverter entity-framework-core-3.1
我正在尝试重用现有的数据库连接,以便我可以使用TransactionScope不调用MSDTC 来执行多个数据库操作.
实体框架(使用DbContext4.1版本中的新API)似乎不希望保持明确打开的连接打开.旧的ObjectContextAPI保持连接按预期打开并记录.
由于DbContextAPI只是ObjectContext在引擎盖下使用,我预计会有同样的行为.有谁知道这个改变是有意还是已知问题?我无法在任何地方找到它.
public void ConnectionRemainsOpen()
{
using (var context = new TestDataContext())
{
try
{
Assert.AreEqual(ConnectionState.Closed, context.Database.Connection.State);
context.Database.Connection.Open();
var firstRecord = context.Table3.FirstOrDefault();
// this Assert fails as State == ConnectionState.Closed
Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State);
var newRecord = new Table3
{
Name = "test",
CreatedTime = DateTime.UtcNow,
ModifiedTime = DateTime.UtcNow
};
context.Table3.Add(newRecord);
context.SaveChanges();
// this Assert would also fail
Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State);
}
finally
{
if (context.Database.Connection.State == ConnectionState.Open)
context.Database.Connection.Close(); …Run Code Online (Sandbox Code Playgroud) 找到下面描述的场景的解决方案花了我太长时间.看似简单的事情应该被证明是相当困难的.问题是:
使用实体框架4.1(代码优先方法)和"独立关联"如何在"分离"场景(在我的案例中为Asp.Net)中为现有的"多对一"关系分配不同的结尾.
该模型:
我意识到使用ForeignKey关系而不是独立关联可能是一个选项,但我喜欢在我的Pocos中没有ForeignKey实现.
客户有一个或多个目标:
public class Customer:Person
{
public string Number { get; set; }
public string NameContactPerson { get; set; }
private ICollection<Target> _targets;
// Independent Association
public virtual ICollection<Target> Targets
{
get { return _targets ?? (_targets = new Collection<Target>()); }
set { _targets = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
目标有一个客户:
public class Target:EntityBase
{
public string Name { get; set; }
public string Description { get; set; }
public string Note { get; set; }
public virtual …Run Code Online (Sandbox Code Playgroud) 我首先遵循数据库方法; 我在SQL Server 2008数据库中创建了表,然后使用ADO.NET实体数据模型将这些表映射到Entity Framework类.但是当我打开designer.cs文件时,我在自定义的类定义中找到了以下代码:
public partial class PortalEntities : ObjectContext
Run Code Online (Sandbox Code Playgroud)
所以我有以下三个让我困惑的问题:
为什么我的PortalEntities班级来自ObjectContext而不是DbContext我期望的?
ObjectContext&之间是否存在重大差异DbContext,或者它们主要相同并提供相同的功能
当我尝试编写类似于以下代码的内容时:
Student student = db.Students.Find(id);
Run Code Online (Sandbox Code Playgroud)我发现我不能使用.Find(),因为我曾经用做方法DbContext,那么,这是否意味着,ObjectContext与DbContext有,我可以用不同的方法?
BR
asp.net entity-framework objectcontext asp.net-mvc-3 dbcontext
有人可以解释一下
在调试模式下,如果我在没有调试的情况下启动项目,我的网页加载时间为116秒,而加载时为15秒.
我已经设置了跟踪语句,并确定在调试模式下,在我的DbContext.SaveChanges方法中花费了大约116秒.
运行项目而不调试在同一部分中花费7秒钟.
如果您想了解更多信息,请在评论中告诉我.
项目设置:
附加信息:(如果您需要更多,请在评论中告诉我)
更新:
正如@ruionwriting建议的那样,我描述了数据库,我发现,无论项目是在调试模式还是生产模式下运行,~2,000 sql命令都会花费相同的时间.(每个命令0毫秒).
但是,在调试模式下,20,000个命令之间的平均绝对时间差为5ms.
与生产模式相比,该组命令的平均时间差为0.3 ms.
这是大约10倍的时间性能差异,并将实体框架隔离为在调试模式下花费额外时间.
有没有办法配置调试版本,以便可以在没有调试标志的情况下引用EntityFramework?
如果我以某种方式通过一些编译器魔术来实现性能,那么在调试功能方面我会失去什么?目前我无法进入实体框架代码,所以我认为我不会错过任何东西.
谢谢!
asp.net performance intellitrace dbcontext entity-framework-5
我想将dbContext的生命周期与会话的生命周期联系起来,例如 - 能够在多个请求上提交或放弃对dbcontext上的一组突变的更改.
有没有其他(更好?)方法来实现这一目标?如果不是,那么创建和处理上下文的合适机制是什么?我正在考虑在会话结束时使用清理的静态哈希表,但也许我正在做它所有错误.我也在考虑只关注那些必须在多个请求上工作的上下文,并保持其余的每个操作的想法.有什么建议?
dbcontext ×10
c# ×5
asp.net ×3
asp.net-core ×1
associations ×1
code-first ×1
intellitrace ×1
performance ×1
put ×1
unit-testing ×1