问题:向我的dbcontext添加对象"Order"时,订单的所有嵌套对象都会"读取"到数据库,尽管嵌套对象是静态数据,并且只在数据库中添加了一个引用.
示例:数据库包含0个订单和3个项目.
我添加了一个包含2个项目的订单.
现在数据库包含1个订单和5个项目.订单中的两个项目已经"读取"到数据库中,即使这些项在db.SaveChanges()之前具有正确的主键.
我意识到我可以在保存更改之前将现有项附加到dbcontext,但这真的是唯一的方法吗?当主键与现有项匹配时,EF不能确定项已存在吗?
有没有人知道在新版本的EF CodeFirst中这是不同的?
我需要在每个数据库会话开始时执行一些 SQL 命令。我通过 DbContext 使用 Entity Framework 5 与 Oracle 11g 数据库交谈。
我想执行:
ALTER SESSION SET NLS_COMP=ANSI;
ALTER SESSION SET NLS_SORT=BINARY_CI;
Run Code Online (Sandbox Code Playgroud)
在会话创建开始时进行不区分大小写的搜索。
我怎么能最好地解决这个问题?
我已经将命令放在 dbContext 的构造函数中,但只有简单的单元测试,它似乎确实有效。但不确定这是否正确
public partial class Entities : DbContext
{
public Entities()
: base("name=Entities")
{
this.Database.ExecuteSqlCommand("ALTER SESSION SET NLS_COMP=ANSI");
this.Database.ExecuteSqlCommand("ALTER SESSION SET NLS_SORT=BINARY_CI");
}
}
Run Code Online (Sandbox Code Playgroud) 花了很多时间,但仍然无法理解如何避免在DbContext中缓存.
我附上了一些简单案例的实体模型,以证明我的意思.
问题是dbcontext缓存结果.例如,我有下一个代码来查询我的数据库中的数据:
using (TestContext ctx = new TestContext())
{
var res = (from b in ctx.Buildings.Where(x => x.ID == 1)
select new
{
b,
flats = from f in b.Flats
select new
{
f,
people = from p in f.People
where p.Archived == false
select p
}
}).AsEnumerable().Select(x => x.b).Single();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,一切都很好:我得到了我想要的东西(只有Archived == false的人).
但是,如果我加入后,另一个查询,例如,查询有已归档的标志设置为true人的建筑,我接下来的事情就,我真正明白水湿:
这个查询的代码是下一个:
using (TestContext ctx = new TestContext())
{
var res = (from b in ctx.Buildings.Where(x => x.ID == 1)
select …Run Code Online (Sandbox Code Playgroud) 简短: 对于每个请求创建一个新的OWIN上下文,我希望能够针对某些资源类型或路径(图像,css,js)阻止这种情况.
完全: 在我们的应用程序启动中,我们注册了一个dbcontext创建委托,以便每个请求只创建一次dbcontext.
public virtual void Configuration(IAppBuilder app)
{
app.CreatePerOwinContext(Factory.DbContextCreateDelegate);
}
Run Code Online (Sandbox Code Playgroud)
如果客户端请求样式表,则将创建OWIN上下文,因此还将创建新的dbcontext.我希望能够根本不创建OwinContext,或者至少能够阻止某些请求类型/路径执行某些"on create"回调.
或者,正如我所知,为什么(部分)"禁用"OWIN的方法会导致问题,我想听听最佳做法是什么?如何在不为每个请求创建数据库上下文的情况下提供静态文件?(这里小小的一点是我们的静态文件是使用虚拟路径提供程序提供的嵌入式资源..."普通"静态文件也会出现问题.)
背景:昨天我开始注意到我们的应用程序的某些部分偶尔没有加载.有时它是单个图像,有时是整个CSS文件.经过一些调查后,我看到一些请求抛出了http 500错误,抛出的异常通常是SQL连接超时(但也有其他异常).
虽然我们当然试图修复这些例外.我确实认为,当客户端请求单个图像时,我们的应用程序设置数据库连接完全是胡说八道...这是单个页面请求的大约10个数据库连接???
对我来说就像这样一个明显的问题,但我昨天一直在谷歌搜索,没有找到任何接近解决方案或解决方法.我错过了什么堆栈?
编辑:我只是尝试了一种方法,我没有实际创建dbcontext而是创建存根.事后看来,这显然不是这个问题的解决方案,因为OwinContext试图继续它的进程,并且当它试图使用该存根dbcontext从数据库中获取用户时将严重失败.dbcontext不是问题,我需要完全绕过Owin ......我想......
我正在使用EntityFramework开发一个项目,我需要从默认数据库的不同数据库中获取模型数据的一部分.如何使用具有相同DbContext的多个连接字符串?
public class HMVoltageDBContext : DbContext, IDisposable// IdentityDbContext<User>, IDisposable
{
static HMVoltageDBContext()
{
Database.SetInitializer<HMVoltageDBContext>(new HMVoltageDatabaseInitializer());
}
public HMVoltageDBContext() : base(nameOrConnectionString: "HMVoltageDB") {
Maps = base.Set<Map>();
MapSteps = base.Set<MapStep>();
MapParents = base.Set<MapParents>();
MapTypes = base.Set<MapType>();
PageSizes = base.Set<PageSize>();
PreparationPlaces = base.Set<PreparationPlace>();
Products = base.Set<Product>();
ProductCategories = base.Set<ProductCategory>();
Statuses = base.Set<Status>();
Steps = base.Set<Step>();
Sets = base.Set<Set>();
MapReceivers = base.Set<MapReceiver>();
Receivers = base.Set<Receiver>();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Use singular table names
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Configurations.Add(new MapConfiguration());
modelBuilder.Configurations.Add(new MapParentsConfiguration());
modelBuilder.Configurations.Add(new …Run Code Online (Sandbox Code Playgroud) 当我在代码中使用工厂模式时,我总是问自己一个问题(C#,但它适用于我认为的任何语言)。
我有一个“服务”,负责与我的数据库交互,对对象进行操作并与我的对象模型交互。
该服务有时使用工厂来委托对象的实例化。但是这个工厂显然需要自己与数据库交互才能正确实例化我的对象。例如,将数据库上下文传递给 Create 方法是好还是坏做法?
像这样 :
var myNewObject = MyFactory.Create(myDatabaseContext);
Run Code Online (Sandbox Code Playgroud)
另一种方法是让服务始终是唯一与数据库对话的服务。
var myNewObject = MyFactory.Create();
var extraProperty = myDatabaseContext.Get(something);
myNewObject.extraProp = extraProperty;
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
c# design-patterns entity-framework factory-pattern dbcontext
不确定我应该参考哪个程序集,以消除此阻塞错误。
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<QAContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
// Add framework services.
services.AddMvc();
}
Run Code Online (Sandbox Code Playgroud)
错误 CS1061“DbContextOptionsBuilder”不包含“UseSqlServer”的定义,并且找不到接受“DbContextOptionsBuilder”类型的第一个参数的扩展方法“UseSqlServer”(您是否缺少 using 指令或程序集引用?)
我想使用 ASP.NET Boilerplate 一次连接到两个数据库。我按照这个例子:https : //github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/MultipleDbContextEfCoreDemo
问题是只有第一个上下文才会有所有的 Abp 表。第二个上下文是现有数据库,其中没有任何 Abp 表。
当我启动 Web 应用程序时,我得到以下信息:
System.Data.SqlClient.SqlException: 'Invalid object name 'AbpLanguages'.'
Run Code Online (Sandbox Code Playgroud)
很明显,它正在第二个上下文中寻找 Abp* 表,但它们不存在(而且它们不应该存在)。那么,拥有多个上下文的正确方法是什么,这样它就不会在第二个上下文中查找 Abp* 表?
我通过修改从模板生成的干净的 ASP.NET Boilerplate 项目创建了一个示例应用程序。
我已经使用模板生成的项目进行了测试,该项目仅适用于 API,并且可以完美运行。但是当 API 和前端在生成项目时结合使用时,我会遇到这些问题,在其他上下文中查找 Abp* 表。
Dropbox:https
: //www.dropbox.com/s/19gj8ms0jwz500k/4.0.1.zip ? dl =0 Github:https : //github.com/FrikkinLazer/MultipleContext.git
c# dbcontext entity-framework-core asp.net-core aspnetboilerplate
我使用实体框架和存储过程。
modelBuilder.Entity<MyModel>().MapToStoredProcedures();
Run Code Online (Sandbox Code Playgroud)
我使用插入更新和删除没有任何问题。但出于某种目的我想使用AutoDetectChangesEnabled = false;
之后该实体不再工作,并且数据库中没有任何变化SaveChanges。但是当我评论AutoDetectChangesEnabled或将其设置为 true 时,它工作正常。
这是我的代码:我从 Excel 读取并导入数据库:
dt = exc.ReadExcel(address, ".xlsx");
using (var db = new Context())
{
db.Configuration.AutoDetectChangesEnabled = false;
for (int i = 1; i < dt.Rows.Count; i++)
{
int id = int.Parse(dt.Rows[i][0].ToString());
var thisChah = db.MyModel.Find(id);
if (thisChah == null)
{
continue;
}
thisChah.f1 = dt.Rows[i][1].ToString();
thisChah.f2 = dt.Rows[i][2].ToString();
thisChah.f3 = dt.Rows[i][3].ToString();
thisChah.f4 = dt.Rows[i][4].ToString();
thisChah.f5 = dt.Rows[i][5].ToString();
thisChah.f6 = dt.Rows[i][6].ToString();
thisChah.f7 = dt.Rows[i][7].ToString();
LogsAnyThing("row " + i …Run Code Online (Sandbox Code Playgroud) 我有一个 IQueryable 扩展方法:
public static void SomeExt<T>(this IQueryable<T> query, DbContext context) {...}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有某种方法可以从查询中获取 DbContext,以便可以删除 DbContext 参数,只留下:
public static void SomeExt<T>(this IQueryable<T> query) {...}
Run Code Online (Sandbox Code Playgroud)
我在 IQueryable 后面尝试过类似Access DataContext 的东西, 但它不起作用,得到零字段。
也有办法从 DbSet 获取它
你能从 DbSet 获取 DbContext 吗?
myDbSet.GetService<'ICurrentDbContext>().Context;
但这不是我需要的。我想从 Query 中获取它?
这是查询:
var q = context.Items.Where(a => a.StatusId = 1);
q.SomeExt(上下文);
与
q.SomeExt();
dbcontext ×10
c# ×6
asp.net-core ×1
asp.net-mvc ×1
code-first ×1
oracle11g ×1
owin ×1
request ×1
static-files ×1