标签: dbcontext

如何将Entity框架中的DbSet转换为ObjectQuery

我正在使用CodeFirst方法并遇到了一个需要将DbSet转换为ObjectQuery的问题.这就是我为转换所做的.

ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext;
ObjectSet<Request> objectSet = objectContext.CreateObjectSet<Request>();
Run Code Online (Sandbox Code Playgroud)

其中db是从DbContext继承的上下文,Request是class.

因此,当我尝试调用期望ObjectQuery为ObjectQueryMethod(objectSet)的方法时,它会抛出以下错误.

"无法确定条件表达式的类型,因为'System.Data.Entity.DbSet <>'和'System.Data.Objects.ObjectQuery <>'之间没有隐式转换"

任何帮助是极大的赞赏!

linq-to-entities entity-framework-4 ef-code-first dbcontext

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

管理dbContext的生命周期

我想将dbContext的生命周期与会话的生命周期联系起来,例如 - 能够在多个请求上提交或放弃对dbcontext上的一组突变的更改.

有没有其他(更好?)方法来实现这一目标?如果不是,那么创建和处理上下文的合适机制是什么?我正在考虑在会话结束时使用清理的静态哈希表,但也许我正在做它所有错误.我也在考虑只关注那些必须在多个请求上工作的上下文,并保持其余的每个操作的想法.有什么建议?

entity-framework dbcontext asp.net-mvc-4

12
推荐指数
1
解决办法
9152
查看次数

是DbSet <>.本地使用什么特别小心?

几天来,我一直在努力从存储库(DbContext)中检索我的实体.

我试图在原子动作中保存所有实体.因此,不同的实体一起代表了我的一些有价值的东西.如果所有实体都是"有效",那么我可以将它们全部保存到数据库中.实体"a"已存储在我的存储库中,需要检索以"验证"实体"b".

这就是问题出现的地方.我的存储库依赖于DbSet<TEntity>与Linq2Sql一起工作的类(Include()例如导航属性).但是,DbSet<TEntity>它不包含处于"已添加"状态的实体.

所以我(据我所知)有两个选择:

  • 使用ChangeTracker以查看哪些实体可用,并根据它们将它们查询到一个集合中EntityState.
  • 使用该DbSet<TEntity>.Local属性.

ChangeTracker似乎涉及一些额外的努力工作,以使我可以使用Linq2Sql Include()导航属性,例如

DbSet<TEntity>.Local似乎有点怪我.它可能只是名字.我只是读了一些表现不佳的东西(比DbSet <>本身慢).不确定这是否是虚假陈述.

具有重要EntityFramework经验的人能否对此有所启发?什么是"明智"的道路?或者我看到了幽灵,我应该总是使用这个.Local属性吗?

使用代码示例更新:


出了什么问题的一个例子

    public void AddAndRetrieveUncommittedTenant()
    {
        _tenantRepository = new TenantRepository(new TenantApplicationTestContext());

        const string tenantName = "testtenant";

        // Create the tenant, but not call `SaveChanges` yet until all entities are validated 
        _tenantRepository.Create(tenantName);

        //
        // Some other code
        //

        var tenant = _tenantRepository.GetTenants().FirstOrDefault(entity => entity.Name.Equals(tenantName));

        // The tenant will …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework dbcontext dbset

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

实体框架代码优先:如何忽略类

这与此处此处的问题类似,但这些问题都是陈旧且没有好的答案.

假设我有以下课程:

class HairCutStyle { 
   public int ID { get; set; }
   public string Name { get; set; }
}

class CustomerHairCutPreference {
   public int ID { get; set; }
   public Customer Customer { get; set; }
   public HairCutStyle HairCutStyle { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

假设我的HairCutStyle数据存储在另一个数据库的表中(我是从Paul Mitchell自己获得的).我想将HairCutStyle类用作POCO类 - 我将在代码中使用它来表示剪发样式,但我不需要在我的数据库中读/写该信息.(假设我有一个单独的服务层,可以从其他数据库填充这些类的数据.)

如何告诉EF NOT在我当前的db上下文中创建HairCutStyle表?但与此同时,我想在CustomerHairCutPreference表中存储一个值,该值是对其他地方存储的HairCutStyle数据的引用.排序的"虚拟"外键,不受实际数据库FK约束的约束.

c# entity-framework poco dbcontext

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

如何在数据库实体的子模型上使用自定义验证属性?

摘要:

我想要一个数据注释验证器来引用同一个类中的另一个属性(TitleAuthorAndPublishingConfiguration).

但是,不直接在此类上调用DB.SaveChanges().而是在这个类(WebsiteConfiguration)的父级上调用它.

因此validationContext.ObjectType返回WebsiteConfiguration,我无法引用TitleAuthorAndPublishingConfiguration数据注释验证器中的属性.


WebsiteConfiguration.cs

public class WebsiteConfiguration
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public TitleAuthorAndPublishingConfiguration TitleAuthorAndPublishing { get; set; }

    public BookChaptersAndSectionsConfiguration BookChaptersAndSections { get; set; }

    public SocialMediaLoginsConfiguration SocialMediaLogins { get; set; }

    public TagGroupsConfiguration TagGroups { get; set; }
}

public class TitleAuthorAndPublishingConfiguration 
{
    public string BookTitle { get; set; }

    public bool IsPublished { get; set; }

    // how do I access …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc data-annotations dbcontext

12
推荐指数
1
解决办法
995
查看次数

正确使用Microsoft.AspNet.Identity 2.0

我迷失了使用MVC 5模板附带的身份验证方法.

我需要将CreateBy用户包含在一个名为client的实体中,所以经过一些研究我得出了这个:

模型:

[Table("Clients")]
public partial class Client
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public virtual int UserCreated_Id { get; set; }

    [ForeignKey("UserCreated_Id")]
    public virtual ApplicationUser UserCreated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器方法:

client.UserCreated_Id = User.Identity.GetUserId<int>();
Run Code Online (Sandbox Code Playgroud)

但我必须改变身份模型中的几乎所有内容:

public class ApplicationUser : IdentityUser
Run Code Online (Sandbox Code Playgroud)

public class ApplicationUser : IdentityUser<int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
Run Code Online (Sandbox Code Playgroud)

因此,差不多有30个变化.

但现在我有2个DbContext:

身份背景:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public ApplicationDbContext() : base("IPDB") {}

    public static ApplicationDbContext Create() …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc dbcontext asp.net-identity

12
推荐指数
1
解决办法
935
查看次数

DbContext SaveChanges语句执行顺序

我有一个表,在具有Ordinal列的表上具有唯一索引.例如,表格将包含以下列:

TableId,ID1,ID2,Ordinal

唯一索引跨越ID1,ID2,Ordinal列.

我遇到的问题是,当从数据库中删除记录时,我会重新排序序数,以便它们再次顺序.我的删除功能如下所示:

    public void Delete(int id)
    {
        var tableObject = Context.TableObject.Find(id);
        Context.TableObject.Remove(tableObject);
        ResequenceOrdinalsAfterDelete(tableObject);
    }
Run Code Online (Sandbox Code Playgroud)

问题在于,当我调用Context.SaveChanges()时,它会打破唯一索引,因为它似乎以不同于传递的顺序执行语句.例如,发生以下情况:

  1. 重新排列普通话
  2. 删除记录

代替:

  1. 删除记录
  2. 重新排列普通话

这是EF的正确行为吗?如果是,是否有一种方法可以覆盖此行为以强制执行顺序?

如果我没有正确解释,请告诉我...

entity-framework-4 ef4-code-only ef-code-first dbcontext

11
推荐指数
1
解决办法
3954
查看次数

实体框架代码优先:DateTime2的DataType属性是什么?

有时使用Entity Framework Code First时,默认约定不会创建所需的数据库类型.例如,默认情况下,type属性System.DateTime会创建一个类型的数据库列DateTime.如果您希望它具有某种类型datetime2(DateTime时区和夏令时没有问题的类型)该怎么办?

可以使用a指定数据注释所需的数据库类型DataTypeAtrribute.DataTypeAttribute的构造函数之一接受参数DataType Enumeration.所以可以指定类似的东西:

[DataType(DataType.DateTime)]
public DateTime DateOfBirth {get; set;}
Run Code Online (Sandbox Code Playgroud)

DataType枚举类型包含许多类型,但它缺少值DateTime2.

另一种方法是使用Fluent API.创建一个DateTime2in方法DBContext.OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>().Property(p => p.BirthDate)
        .HasColumnType("datetime2");
}
Run Code Online (Sandbox Code Playgroud)

DataTypeAttribute有第二个接受字符串的构造函数.该字符串定义为

要与数据字段关联的自定义字段模板的名称.

因此可以假设以下内容足以创建datetime2:

[DataType("datetime2")]
public DateTime DateOfBirth {get; set;}
Run Code Online (Sandbox Code Playgroud)

唉,这不起作用.创建的列仍具有DateTime格式.

问题:在构造函数中使用哪个字符串来创建datetime2?

c# entity-framework dbcontext

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

在长期存在的实体框架上下文中刷新Sql连接Azure AD访问令牌

我正在尝试设置一些.NET应用程序,以便对Azure Active Directory使用基于证书的身份验证,然后使用Active Directory授权我访问Sql Azure数据库.

我遇到的问题是应用程序的某些部分使用的DbContext可能有点太长.如果您在访问令牌到期后的5分钟内请求访问令牌,则ADAL库会尝试刷新访问令牌.麻烦的是我的一些DbContexts可能活超过5分钟.因此,在DbContext的生命周期中,访问令牌不再好,当我尝试SaveChanges时,我得到一个数据库连接异常.

除了重构使我的DbContexts活动时间短于5分钟,我还能做些什么来解决这个问题吗?

我尝试过的一件事是在实体框架中找到一些钩子,我可以捕获过期的访问令牌异常,然后用新创建的具有新访问令牌的连接替换当前连接.我尝试传递EF自定义连接工厂,然后使用执行策略在我收到过期令牌异常时重试.这对我不起作用,因为我无法从自定义执行策略修改或重新创建当前连接.

任何想法将不胜感激.

谢谢!

c# entity-framework dbcontext azure-active-directory adal

11
推荐指数
1
解决办法
816
查看次数

.net Core 2、EF 和多租户 - 基于用户的 Dbcontext 切换

我有(几乎)最糟糕的多租户。我正在构建一个 asp.net 核心网站,我正在将一堆 pokey 小 Intranet 网站移植到该网站。每个子站点将是一个 asp.net 区域。我有一个IdentityContext身份的东西。我有多个供应商数据库副本,每个副本都有多个租户。该ApplicationUser班有,我想用切换分贝范围内的OrgCode财产。

我可以看到自己需要将 User.OrgCode 和 Area 映射到连接字符串的东西

Stack Overflow 上有很多这方面的部分示例。一个下午的阅读后,我很困惑。它的核心接缝是:

  • 从构造函数参数中删除 DI dbcontext ref。
  • 在控制器构造函数中实例化 dbcontext。
  • 像以前一样使用 dbcontext。

我在正确的轨道上吗?

有什么连贯的例子吗?


编辑 2020/07/09

不幸的是,这变得更加紧迫。

身份数据库与租户无关。Identity 中的每个用户都有一个 OrgCode 标识符。(自定义用户属性)。

每个服务器都通过使用“成本中心”内置了多租户。服务器在每台服务器上都有一组名称相同的数据库。

  1. 核心供应商数据库
  2. 我们存储扩展的自定义数据库
  3. 用于我们的作业输出的日志数据库

还有一些小型应用程序特定数据库已经使用组织代码来识别用户

服务器 A - 1 组织代码

服务器 B - 4 个组织代码

服务器 C - 3 个组织代码参与项目,50+ 还没有(大部分很小)

服务器 D - 目前没有使用组织代码。服务器上 80+。(很快)

不可能将所有组织合并到一台服务器上。存在法律和技术后果。每个服务器都有数百个远程转发器向它们报告需要更新。这些提供的数据是我们的自定义作业使用的数据。

梦想是继续在每个页面中使用 DI,根据需要传入上下文。然后上下文将足够智能,可以根据用户名的 OrgCode 选择正确的底层连接详细信息。

我对使用代理这个词犹豫不决,因为它在这个空间中似乎负载很重。

地狱,如果我知道把它放在哪里,即使使用 switch 语句也很好

预期效果来自 Org XYZ 的用户加载需要供应商数据库的页面,他们从 XYZ 映射到的服务器获取该页面。 …

c# entity-framework dbcontext asp.net-core

11
推荐指数
2
解决办法
1241
查看次数