标签: dbcontext

MVC、DbContext 和多线程

关于这些主题有很多问题,每个人都有自己的看法。也许有人可以就以下问题给我一个很好的答案。

我有一个 Asp.NET MVC Web 服务,它使用 EntityFramework 来访问数据库。有一个控制器,每次用户向 Web 服务发出请求时都会创建一个控制器实例。每个请求都很快。它只是从 DB 获取一些数据,更改它然后保存它。

当然,问题是如何维护 DbContext(因为它不是线程安全的)?在控制器的 ctor 上,我创建了一个 DbContext 实例。在控制器的 Dispose() 上,我处理了 DbContext。

我在一些帖子中看到,为每个请求创建一个实例并不是一个好习惯。不是吗?

谢谢,伊迪。

asp.net-mvc entity-framework thread-safety dbcontext

5
推荐指数
1
解决办法
2097
查看次数

为什么不调用种子方法?

我正在编写一个 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.

为什么会这样,我该如何编写代码以便执行种子方法?

提前致谢。

c# seeding dbcontext entity-framework-6 asp.net-mvc-5

5
推荐指数
1
解决办法
4780
查看次数

EF 6 Code First,使用包含在导航属性上的外键ID更改会导致"发生引用完整性约束违规"错误

我正在使用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

5
推荐指数
1
解决办法
3184
查看次数

在MVC中根据请求使用Owin DbContext的实体框架

我注意到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)

c# asp.net-mvc entity-framework dbcontext owin

5
推荐指数
1
解决办法
4475
查看次数

如何在实体框架上下文类中动态更改模型创建的列名

我有一个这样的基类:

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)

c# entity-framework dbcontext ef-fluent-api

5
推荐指数
2
解决办法
2356
查看次数

2017年,在保留关系的同时,将实体框架应用程序迁移远离使用EDMX的最佳方法是什么

我已经看到一些旧问题要求相同(将实体框架EDMX转换为代码优先的工具),但大多数回到2009-2014(EF"模型优先":在类中创建edmx和db-table中的实体?/How使用来自EDMX文件的映射生成Entity Framework 6.x POCO类?)所以想问一下2017年的情况是否更好!

我们有一个EDMX,我们已经设置了使用DbContext生成器 - 这提供了更清晰的POCO和更简洁的上下文派生自DbContext而不是现在古老的ObjectContext但是我想完全放弃(完全不可合并的)edmx,但保持很多很多的关系,我们有我们有60多实体之间.只需删除当前的tt模板,就会丢失所有实体关系数据.

现在有一种工具或方法可以帮助实现这一目标吗?我无法相信微软自己还没有发布过一个工具(因为我相信他们不会产生关系,所以不再使用powertools)

c# entity-framework edmx dbcontext entity-framework-6

5
推荐指数
0
解决办法
300
查看次数

使用依赖注入时如何修复“在上一个操作完成之前在此上下文中启动的第二个操作......”?

从数据库读取数据时出现此错误:

在前一个操作完成之前,在此上下文中启动了第二个操作。不保证任何实例成员都是线程安全的。

我有以下 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)

c# entity-framework dbcontext

5
推荐指数
1
解决办法
1万
查看次数

在另一个类asp.net core 2中访问DbContext

在我的控制器中,我有这个

private readonly DbContext _context;

public CountryController(DbContext context)
{
    _context = context;
}
Run Code Online (Sandbox Code Playgroud)

如何在其他类(如静态类)中检索 DbContext 而不将其作为参数传递给方法调用

dbcontext asp.net-core-2.0

5
推荐指数
1
解决办法
2561
查看次数

我什么时候需要在 EF 的 DbContext 中指定 DbSet?

我有点困惑。直到今天,我认为每个表(由 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)

.net c# asp.net entity-framework dbcontext

5
推荐指数
1
解决办法
2236
查看次数

EF Core / DbContext&gt;映射自定义类型作为主键

使用流利的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)

c# dbcontext entity-framework-core .net-core

5
推荐指数
1
解决办法
2183
查看次数