关于这些主题有很多问题,每个人都有自己的看法。也许有人可以就以下问题给我一个很好的答案。
我有一个 Asp.NET MVC Web 服务,它使用 EntityFramework 来访问数据库。有一个控制器,每次用户向 Web 服务发出请求时都会创建一个控制器实例。每个请求都很快。它只是从 DB 获取一些数据,更改它然后保存它。
当然,问题是如何维护 DbContext(因为它不是线程安全的)?在控制器的 ctor 上,我创建了一个 DbContext 实例。在控制器的 Dispose() 上,我处理了 DbContext。
我在一些帖子中看到,为每个请求创建一个实例并不是一个好习惯。不是吗?
谢谢,伊迪。
我正在编写一个 MVC 5 互联网应用程序,并希望得到一些帮助来执行种子方法以使用一些实体填充数据库。
这是我的DbContext代码:
public class CanFindLocationDatabaseContext : DbContext
{
public class SystemInitializer : CreateDatabaseIfNotExists<CanFindLocationDatabaseContext>
{
protected override void Seed(CanFindLocationDatabaseContext context)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的Application_Start方法中,我有以下代码:
System.Data.Entity.Database.SetInitializer<CanFindLocationDatabaseContext>(new CanFindLocation.Context.CanFindLocationDatabaseContext.SystemInitializer());
Run Code Online (Sandbox Code Playgroud)
当我访问类中的任何DbSet对象时CanFindLocationDatabaseContext,不会执行种子方法。在我测试种子代码之前没有数据库。
正在创建数据库,正在创建表,但是没有调用seed 方法,并且任何表中都没有数据。
我在同一个项目中还有以下标识 2.1 的代码:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("CanFindLocationDatabaseContext", throwIfV1Schema: false)
{
}
}
Run Code Online (Sandbox Code Playgroud)
为该 DbContext 类调用种子方法,但不为CanFindLocationDatabaseContext.
为什么会这样,我该如何编写代码以便执行种子方法?
提前致谢。
我正在使用Entity Framework 6.1.3,并且我有一个场景,我使用其导航属性检索实体(使用Include())并将其与上下文断开连接,更改外键ID然后将其重新附加到新的DbContext:
// Init the Db
using (var db = new MyContext())
{
var theWarranty = new ProductWarranty { WarrantyName = "The Warranty" };
var newWarranty = new ProductWarranty { WarrantyName = "New Warranty" };
var brand = new ProductBrand { BrandName = "The Brand", DefaultWarranty = theWarranty };
db.ProductBrands.Add(brand);
db.ProductWarranties.Add(newWarranty);
db.SaveChanges();
}
// Load the detached Brand
ProductBrand detachedBrand;
using (var db = new MyContext())
{
detachedBrand = db.ProductBrands.AsNoTracking()
.Include(b => b.DefaultWarranty) // <<< If this line is …Run Code Online (Sandbox Code Playgroud) c# entity-framework ef-code-first dbcontext entity-framework-6
我注意到MVC的项目模板在使用单个用户帐户时会将一些对象放在当前的Owin上下文中(in App_Start/Startup.Auth.cs):
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
Run Code Online (Sandbox Code Playgroud)
看起来这是访问数据库的Identity功能.我的理解是,ApplicationDbContext每个请求创建一个单个实例,并通过整个管道重新使用.用我自己的实体框架做同样的事情是否有益DbContext?
例如,我在以下位置创建了一个新文件App_Start/Startup.Data.cs:
public partial class Startup
{
public void ConfigureData(IAppBuilder app)
{
app.CreatePerOwinContext(CreateParkingEntities);
}
protected ParkingEntities CreateParkingEntities()
{
return new ParkingEntities();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在Startup.cs:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
ConfigureData(app);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我可以在我的控制器中使用上下文:
private ParkingEntities _db;
public ParkingEntities DbContext
{
get
{
return …Run Code Online (Sandbox Code Playgroud) 我有一个这样的基类:
public class BaseClass : IEditableObject {
public BaseClass() {
}
public Guid Id { get; set; }
public void BeginEdit() {
}
public void CancelEdit() {
}
public void EndEdit() {
}
}
Run Code Online (Sandbox Code Playgroud)
我有 2 个这样的派生类:
public class User : BaseClass {
[Column( "UserFirstName" )]
public string FirstName {
get;
set;
}
[Column( "UserLastName" )]
public string LastName {
get;
set;
}
}
public class School : BaseClass {
[Column( "SchoolName" )]
public string Name {
get;
set;
} …Run Code Online (Sandbox Code Playgroud) 我已经看到一些旧问题要求相同(将实体框架EDMX转换为代码优先的工具),但大多数回到2009-2014(EF"模型优先":在类中创建edmx和db-table中的实体?/How使用来自EDMX文件的映射生成Entity Framework 6.x POCO类?)所以想问一下2017年的情况是否更好!
我们有一个EDMX,我们已经设置了使用DbContext生成器 - 这提供了更清晰的POCO和更简洁的上下文派生自DbContext而不是现在古老的ObjectContext但是我想完全放弃(完全不可合并的)edmx,但保持很多很多的关系,我们有我们有60多实体之间.只需删除当前的tt模板,就会丢失所有实体关系数据.
现在有一种工具或方法可以帮助实现这一目标吗?我无法相信微软自己还没有发布过一个工具(因为我相信他们不会产生关系,所以不再使用powertools)
从数据库读取数据时出现此错误:
在前一个操作完成之前,在此上下文中启动了第二个操作。不保证任何实例成员都是线程安全的。
我有以下 ApplicationContext.cs:
public class ApplicationContext : Microsoft.EntityFrameworkCore.DbContext
{
public ApplicationContext(DbContextOptions<ApplicationContext> options)
: base(options)
{ }
public DbSet<MyClass> MyClasses{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
下面的 ApplicationContextFactory.cs
public class ApplicationContextFactory : IDesignTimeDbContextFactory<ApplicationContext>
{
public ApplicationContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<ApplicationContext>();
var connection = "myConnectionString";
builder.UseSqlServer(connection);
return new ApplicationContext(builder.Options);
}
}
Run Code Online (Sandbox Code Playgroud)
以下 ServiceLoader.cs(我在其中声明 DI):
public static class ServiceLoader
{
public static void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IRepository, Repository>();
var connection = "myConnectionString";
services.AddDbContext<ApplicationContext>(options => options.UseSqlServer(connection));
}
}
Run Code Online (Sandbox Code Playgroud)
最后,以下存储库,其中抛出异常:
public class …Run Code Online (Sandbox Code Playgroud) 在我的控制器中,我有这个
private readonly DbContext _context;
public CountryController(DbContext context)
{
_context = context;
}
Run Code Online (Sandbox Code Playgroud)
如何在其他类(如静态类)中检索 DbContext 而不将其作为参数传递给方法调用
我有点困惑。直到今天,我认为每个表(由 EF 使用)都必须在DbContext类中指定。但看起来我只需要一个!真的吗?
让我解释一下,这是我的 DbContext:
public class MyDbContext : DbContext
{
public MyDbContext()
: base("name=MyDbContext")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<MyDbContext>(null);
base.OnModelCreating(modelBuilder);
}
public DbSet<Table1> Table1 { get; set; }
public DbSet<Table2> Table2 { get; set; }
public DbSet<Table3> Table3 { get; set; }
public DbSet<Table4> Table4 { get; set; }
public DbSet<Table5> Table5 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是两个示例表,连接 1:many
[Table("Table1")]
public class Table1
{
[Key]
[Column("Table1Id", TypeName = "uniqueidentifier")] …Run Code Online (Sandbox Code Playgroud) 使用流利的api,如何在DbContext类的OnModelCreating方法内将自定义类型映射为主键?
我正在尝试使用EF Core为跟随实体建立模型。
public class Account
{
public AccountId AccountId { get; }
public string Name { get; set; }
private Account()
{
}
public Account(AccountId accountId, string name)
{
AccountId = accountId;
Name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
主键是AccountId; 类型是一个像这样的简单值对象。
public class AccountId
{
public string Id { get; }
public AccountId(string accountId)
{
Id = accountId;
}
}
Run Code Online (Sandbox Code Playgroud)
在中OnModelCreating,我发现AccountId没有后备字段就无法映射。因此,我介绍了支持领域_accountId。我不希望AccountId具有设置器。
public class Account
{
private string _accountId;
public AccountId AccountId { get …Run Code Online (Sandbox Code Playgroud)