我想将我的DbContext班级分成几部分,以便每个模块都有自己的班级,我相信这会让工作更容易,更多的错误宝座并降低代码复杂性。
我相信我在过去的某个地方在谷歌搜索时看到过它,但没有找到它。
我DbContext在基础设施层,我的类在域上下文中。那不是问题。我想将映射和配置分成单独的类。我的DbContext意志保持不变,除非它会被分裂。
我标记了我愿意在下面分成几部分的代码和平:
public class WestCoreDbContext : DbContext
{
public WestCoreDbContext(DbContextOptions<WestCoreDbContext> options) : base(options)
{
}
#region WOULD LIKE TO SPLIT THIS PART
public virtual DbSet<SoftwareTest> SoftwareTests { get; set; }
public virtual DbSet<SoftwareTestCase> SoftwareTestCases { get; set; }
public virtual DbSet<SoftwareTestCaseStep> SoftwareTestCaseSteps { get; set; }
public virtual DbSet<SoftwareTestCaseStepResult> SoftwareTestCaseStepResults { get; set; }
public virtual DbSet<Position> Positions { get; set; }
#endregion
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
#region WOULD LIKE …Run Code Online (Sandbox Code Playgroud) I've configured my DbContext with services.AddDbContext() in the Startup class and constructor injection in my controllers works very well.
默认情况下,它是一个范围服务,但我在应用程序中有一个地方,我想在单独的工作范围内更新实体的单个属性。所以我需要在控制器中创建一个新的 DbContext,但我不确定如何。我希望它由 DI 创建,因此我不必手动调用构造函数并提供所需的所有选项。有没有办法做到这一点?也许有办法从 DI 获取数据库上下文选项?然后我可以轻松构建 DbContext。
我有一个这样的表结构:
ID Code Value
1 2 text1
2 3 text3
2 4 text4
Run Code Online (Sandbox Code Playgroud)
这里 ID 和 Code 形成复合主键,即在上表中不能有 ID = 2 和 Code = 4 的另一行。
现在我们使用实体框架核心,我有一个名为 Branch 的类(代表组合键),如下所示:
public class Branch
{
public int ID {get; set;}
public int Code {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
List<Branch>其次我也有一个。现在我想做两件事:
首先进行一次数据库调用并获取整个分支列表的完整对象(ID、代码、值)。
之后,我将更改每个对象的“值”。
然后我想进行一次数据库调用并保存每一行更新的“值”。
目前我正在循环中执行此操作,因此效率低下。
foreach(var x in listOfBranch)
{
var record = context.Table.Find(x.ID, x.Code);
record.Value = "new value";
context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我们怎样才能在一次通话中做到这一点?谢谢。
c# entity-framework composite-key dbcontext entity-framework-core
我有一个使用Asp.Net MVC Core 2.1构建的3层(Presentation - Business - Data)应用程序
在我的Presentation层中,我有一个ApplicationDbContext类,它实例化并填充测试数据库:
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
SeedData(builder);
}
// Database Tables
public DbSet<Customer> Customers { get; set; }
public DbSet<Ingredient> Ingredients { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
public DbSet<Pizza> Pizzas { get; set; }
public DbSet<PizzaIngredient> PizzaIngredients { get; set; }
// Fill Database with …Run Code Online (Sandbox Code Playgroud) 我试图测试一些使用实体框架的代码,但我无法弄清楚如何从单独的 MSTest 项目中引用 EF 上下文类。两个项目都在同一个解决方案中。
无法将 lambda 表达式转换为类型“DbContextOptions”,因为它不是委托类型
在我的测试用例中:
[TestClass]
public class GreenCardUserTest
{
[TestMethod]
public void TestAddUser()
{
// REFERENCE TO OTHER PROJECT. WORKS FINE
AppUserViewModel a = new AppUserViewModel();
//LIKELY INCORRECT attempt to duplicate code from Startup.cs in other project
using (GreenCardContext _gc = new GreenCardContext(options => options.UseSqlServer(Configuration.GetConnectionString("MyConnection"))))
{
new GCLandingUserModel().AddUser(a,_gc);
}
}
}
Run Code Online (Sandbox Code Playgroud)
摘自主项目 Startup.cs(工作正常):
services.AddDbContext<GreenCardContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyConnection")));
Run Code Online (Sandbox Code Playgroud) 我需要使用特定类型的实体创建数据库上下文,因为我在解决方案上有多个数据库上下文。我的问题是OnModelCreating我们从程序集中应用配置builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly())所以我想仅使用IEntityTypeConfiguration具有基本模型的实体的类型来应用配置BaseEntity,如下所示
public class DaysOfWeekBuilder : IEntityTypeConfiguration<DaysOfWeek>
{
public void Configure(EntityTypeBuilder<DaysOfWeek> builder)
{
builder.ToTable("DaysOfWeek");
builder.Property(e => e.Name).HasMaxLength(15);
}
}
Run Code Online (Sandbox Code Playgroud)
所以DaysOfWeek实体有基类BaseEntity
public class DaysOfWeek : BaseEntity
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我们如何 IEntityTypeConfiguration使用具有基本模型的实体进行过滤BaseEntity?
谢谢
c# dbcontext entity-framework-core asp.net-core entity-framework-migrations
鉴于 EF Core 已经实现了存储库模式 ( DbSet) 和工作单元 ( DbContext),我可以DbSet像这样直接在我的存储库中使用吗?
public class MyEfRepository : IMyRepository
{
private readonly DbSet<MyModel> _myModels;
public MyEfRepository(MyDbContext ctx)
{
_myModels = ctx.MyModels;
}
public MyModel FindById(Guid id)
{
return _myModels.Where(x => x.Id == id).SingleOrDefault();
}
}
Run Code Online (Sandbox Code Playgroud)
并按以下方式实施工作单元?
public class MyEfUnitOfWork : IMyUnitOfWork
{
private readonly MyDbContext _ctx;
public IMyRepository MyModels { get; }
public MyEfUnitOfWork(MyDbContext ctx, MyEfRepository repo)
{
_ctx = ctx;
MyModels = repo;
}
void Commit() => _ctx.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我想知道,因为我正在阅读的每一篇指南都建议将整个内容注入存储库以及通过它进行访问 …
c# unit-of-work repository-pattern dbcontext entity-framework-core
我正在使用 EF DbContext SqlQuery 来使用 PagedList ( https://github.com/TroyGoode/PagedList )获取分页对象列表,但出现以下错误:
“SqlParameter 已包含在另一个 SqlParameterCollection 中”
这是我的存储库代码:
var db = (DbContext)DataContext;
const string sqlString =
@"
WITH UserFollowerList
AS
(
SELECT uf.FollowId
FROM UserFollow uf
WHERE uf.UserId = @UserId
)
SELECT * FROM UserFollowerList uf
INNER JOIN [User] u ON uf.FollowId = u.UserId
WHERE IsDeleted = 0
"
;
var userIdParam = new SqlParameter("UserId", SqlDbType.Int) {Value = userId};
var userList =
db.Database.SqlQuery<User>(sqlString, userIdParam)
.ToPagedList(pageIndex, pageSize);
return userList;
Run Code Online (Sandbox Code Playgroud)
但是当我在 SqlQuery 语句上调用 ToList 扩展时,它工作正常:
var …Run Code Online (Sandbox Code Playgroud) 我是MVC4框架的新手,并且一直致力于许可应用程序,该应用程序必须为不同的产品使用不同的数据库(每个数据库包含一个产品的少数表 - 所有这些都由专有许可工具生成).我的应用程序应能够支持各种产品上的CRUD功能,因此DbContext每个产品需要与不同型号相关的多个对象.
据我所知,每个这样的DbContext对象都需要Web.config文件中的连接字符串.我正在努力列出(Index.cshtml)各种产品的现有许可证,使用DropDownList控制,每当用户从DropDownList控件中选择不同的产品时,我需要连接到不同的数据库.
任何帮助将受到高度赞赏.谢谢.
我对这个问题感到非常困惑.我查看过以前的'错误语法'帖子,但他们有明确的例子.我有一些C#代码将DbContext查询代码写入我的数据库.我在同一查询代码中指向不同字符的更改错误:
db.Database.ExecuteSqlCommand("INSERT INTO AspNetUsers (Id, Email,
EmailConfirmed, PasswordHash, SecurityStamp, UserName, Location, First_Name,
Last_Name, Bio, Online_Collaboration, Instrument, Genre, PhoneNumberConfirmed,
TwoFactorEnabled, LockoutEnabled, AccessFailedCount) " +
"VALUES ('" + muser.Id + "', '" + muser.EmailAddress + "', 1, '" +
muser.SecurityStamp + "', '" + muser.Username + "', '" + muser.Location + "',
'" + muser.FirstName + "', '" + muser.LastName + "', '" + muser.Bio + "', 1,
0, 0, 0, 0, 0, 0)");
Run Code Online (Sandbox Code Playgroud)
错误范围.这些是下面的一些示例,但'x附近的语法'主要在这些字母之间变化:
System.Data.SqlClient.SqlException: 'Incorrect syntax near 't'.'
System.Data.SqlClient.SqlException: 'Incorrect …Run Code Online (Sandbox Code Playgroud) 我想在控制器之外的另一个类(称为 FileWatcher)中访问数据库/dbContext。这个 web 应用程序还使用 Hangfire 不断监听新创建的文件的目录,它需要解析文件并将信息添加到数据库中。
所以我的 startup.cs 看起来像:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<JobsContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddHangfire(config =>
config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHangfireDashboard("/hangfire");
app.UseHangfireServer();
FileWatcher = new FileWatcher();
BackgroundJob.Enqueue(() => FileWatcher.Watch());
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Run Code Online (Sandbox Code Playgroud)
我的 FileWatcher 类:
public class FileWatcher
{ …Run Code Online (Sandbox Code Playgroud) 我有一个要运行的核心项目,但出现该错误。
这是我的代码:
public class OrderDetailsContext
{
public OrderDetailsContext(DbContextOptions<OrderDetailsContext> options) : base(options)
{ }
//defining table
public DbSet<OrderDetails> OrderDetails { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但我有这个错误,我提到我应该怎么做?
我的问题假设简单地插入到没有相关关系的表中.
// various unrelated operations w/context...
var one = new DbRecord();
var two = new DbRecord();
var thr = new DbRecord();
context.DbRecords.Add(one);
context.DbRecords.Add(two);
context.DbRecords.Add(thr);
// various unrelated operations w/context...
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的DbRecord实体是否总是按照我将它们添加到DbSet的顺序插入?他们似乎在我的测试中,但我能依靠这个吗?
"各种不相关的操作"指的是对相同上下文的不同的,不相关的DbSet的操作; 插入,删除和更新的实体(POCO,在我的情况下)
我希望它们按照确切的顺序插入,这样我就可以使用pk/identity字段进行排序,但我还需要利用上下文提供的隐式事务我的context.SaveChanges().尽管就数据库模式而言其他操作不相关,但条目本身实质上是关于正在执行的更新的日志条目,并且它们的顺序是关键的.
如果上下文不保证以相同的顺序插入记录,我将不得不在记录中添加datetime字段,并自己处理回滚.
dbcontext ×13
c# ×10
asp.net-core ×4
.net-core ×1
asp.net-mvc ×1
core ×1
database ×1
ef-core-2.2 ×1
entity-framework-migrations ×1
layered ×1
mstest ×1
pagedlist ×1
sql ×1
sqlparameter ×1
unit-of-work ×1