我正在使用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 <>'之间没有隐式转换"
任何帮助是极大的赞赏!
我想将dbContext的生命周期与会话的生命周期联系起来,例如 - 能够在多个请求上提交或放弃对dbcontext上的一组突变的更改.
有没有其他(更好?)方法来实现这一目标?如果不是,那么创建和处理上下文的合适机制是什么?我正在考虑在会话结束时使用清理的静态哈希表,但也许我正在做它所有错误.我也在考虑只关注那些必须在多个请求上工作的上下文,并保持其余的每个操作的想法.有什么建议?
几天来,我一直在努力从存储库(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) 这与此处和此处的问题类似,但这些问题都是陈旧且没有好的答案.
假设我有以下课程:
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约束的约束.
摘要:
我想要一个数据注释验证器来引用同一个类中的另一个属性(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) 我迷失了使用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) 我有一个表,在具有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()时,它会打破唯一索引,因为它似乎以不同于传递的顺序执行语句.例如,发生以下情况:
代替:
这是EF的正确行为吗?如果是,是否有一种方法可以覆盖此行为以强制执行顺序?
如果我没有正确解释,请告诉我...
有时使用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?
我正在尝试设置一些.NET应用程序,以便对Azure Active Directory使用基于证书的身份验证,然后使用Active Directory授权我访问Sql Azure数据库.
我遇到的问题是应用程序的某些部分使用的DbContext可能有点太长.如果您在访问令牌到期后的5分钟内请求访问令牌,则ADAL库会尝试刷新访问令牌.麻烦的是我的一些DbContexts可能活超过5分钟.因此,在DbContext的生命周期中,访问令牌不再好,当我尝试SaveChanges时,我得到一个数据库连接异常.
除了重构使我的DbContexts活动时间短于5分钟,我还能做些什么来解决这个问题吗?
我尝试过的一件事是在实体框架中找到一些钩子,我可以捕获过期的访问令牌异常,然后用新创建的具有新访问令牌的连接替换当前连接.我尝试传递EF自定义连接工厂,然后使用执行策略在我收到过期令牌异常时重试.这对我不起作用,因为我无法从自定义执行策略修改或重新创建当前连接.
任何想法将不胜感激.
谢谢!
我有(几乎)最糟糕的多租户。我正在构建一个 asp.net 核心网站,我正在将一堆 pokey 小 Intranet 网站移植到该网站。每个子站点将是一个 asp.net 区域。我有一个IdentityContext身份的东西。我有多个供应商数据库副本,每个副本都有多个租户。该ApplicationUser班有,我想用切换分贝范围内的OrgCode财产。
我可以看到自己需要将 User.OrgCode 和 Area 映射到连接字符串的东西
Stack Overflow 上有很多这方面的部分示例。一个下午的阅读后,我很困惑。它的核心接缝是:
我在正确的轨道上吗?
有什么连贯的例子吗?
不幸的是,这变得更加紧迫。
身份数据库与租户无关。Identity 中的每个用户都有一个 OrgCode 标识符。(自定义用户属性)。
每个服务器都通过使用“成本中心”内置了多租户。服务器在每台服务器上都有一组名称相同的数据库。
还有一些小型应用程序特定数据库已经使用组织代码来识别用户
服务器 A - 1 组织代码
服务器 B - 4 个组织代码
服务器 C - 3 个组织代码参与项目,50+ 还没有(大部分很小)
服务器 D - 目前没有使用组织代码。服务器上 80+。(很快)
不可能将所有组织合并到一台服务器上。存在法律和技术后果。每个服务器都有数百个远程转发器向它们报告需要更新。这些提供的数据是我们的自定义作业使用的数据。
梦想是继续在每个页面中使用 DI,根据需要传入上下文。然后上下文将足够智能,可以根据用户名的 OrgCode 选择正确的底层连接详细信息。
我对使用代理这个词犹豫不决,因为它在这个空间中似乎负载很重。
地狱,如果我知道把它放在哪里,即使使用 switch 语句也很好
预期效果来自 Org XYZ 的用户加载需要供应商数据库的页面,他们从 XYZ 映射到的服务器获取该页面。 …