我收到LINQ查询标题中显示的错误,该查询包括来自两个不同edmx文件的两个表.这是查询:
var query = (from a in db1.Table1
join b in db1.Table2 on a.Id equals b.Id
orderby a.Status
where b.Id == 1 && a.Status == "new"
select new
{
Id = a.Id,
CompanyId = (from c in db2.Company
where s.Id == a.Id
select
new { c.CompanyId })
});
Run Code Online (Sandbox Code Playgroud)
db1并且db2是与两个不同的edmx文件关联的上下文.我怎样才能克服这个错误?
我试图了解实体如何在多个有界上下文中运行.
给予公司员工.在(例如)人力资源上下文中,此人具有姓名,地址,工资参考编号和银行帐户.但在会计方面,所有相关的是工资参考编号和银行账户.
您是否在HR上下文中有Employee实体,SalariedEmployee在Accounting上下文中有Value-Type(例如)?
class Employee
{
public BankAccount BankAcountDetails { get; set; }
public string FullName { get; set; }
public Address ResidentialAddress { get; set; }
public string SalaryRef { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
SalariedEmployee class(??):Employee的值类型
class SalariedEmployee
{
public SalariedEmployee(string salaryRef, BankAccount bankAcountDetails)
{
...
}
public string SalaryRef { get; }
public BankAccount BankAcountDetails { get; }
}
Run Code Online (Sandbox Code Playgroud)
有界上下文中的HRService是否返回此信息?或者你在两种情况下都使用Employee类?
我们有一个数据库,其中的表以多种模式组织,例如 Common.User 和 Product.Order。不同模式中也存在同名的表。
是否可以以某种方式使用此模式来组织 DBContext 中的 DbSet 对象?对我们来说最好的解决方案是访问用户对象,例如 dbcontext.Common.User。这可能吗?
一般来说,在 EF Core 中使用多个数据库架构的最佳策略是什么?
编辑:问题并不针对如何映射来自不同模式的表(entity.ToTable("User","Common"))。它是根据 DbContext 中的架构来组织映射表的。
这是我的第一个问题,我知道在搜索之前我应该搜索一下,我确信我已经完成了搜索,但是我找不到合适的信息.
我使用代码优先的方法来实现我的Context和我的模型,所以我有一个简单的上下文,如:
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public partial class MultipleContext : DbContext
{
public MariaDBContext(string connection) : base(connection)
{
//Database.SetInitializer<MultipleDBContext>(new MariaDbInitializer());
}
public virtual DbSet<Test> Tests { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Test>().ToTable("test")
.HasKey(e => e.ID);
}
}
Run Code Online (Sandbox Code Playgroud)
和我的模特:
public partial class Test
{
public int ID { get; set; }
public string Name { get; set; }
public string Family { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有两个connectionstrings如下:
<connectionStrings>
<add name="MariaDBContext" connectionString="server=127.0.0.1;user id=root;password=xx;database=sb1" providerName="MySql.Data.MySqlClient" />
<add name="SqlDBContext" connectionString="Data …Run Code Online (Sandbox Code Playgroud) 在 DDD 中,指南指出领域模型不应该与持久性有关。这意味着不同的域模型可能依赖于相同的表。同时,由于 ORM 在转换模型方面的技术限制(我想是?),这个目标似乎很难实现。有没有一种方法,使用实际的 ORM,创建依赖于数据库中相同表的非常具体的域模型,并防止我们在 99.99% 的 DDD 实现中所拥有的实体和表之间令人失望的 [1:1] 映射?这些技术限制(?)是否会使该指南过时?
谢谢,
摘要
这个问题是关于方法论的。答案应该是在针对所描述的场景的上下文中与圣杯的链接。
我们在MVC Web应用程序项目中遇到了与dbContext的使用相关的不同问题。
在阅读了许多问答博客,文章……(包括具有存储库和注入模式的提案,Owin,Entity Framework,Ninject)之后,我们仍然不清楚使用dbContext的正确方法。
在MVVC表示层/域实体/逻辑/数据访问层之间进行分隔(包括身份安全处理用户和角色权限)时,是否有任何文章,演示以及与“ CRUD”操作相比更复杂的应用程序中使用“方法”的方法?
描述
以前,我们的方法是在每个存储库中需要时创建dbContext对象。很快,由于连接与存储库功能一起消失,我们发现了诸如“ dbContext已处置”之类的错误。这使得检索到的对象“部分可用”到应用程序的上层(使用技巧.ToList(),这是有限的,因为我们可以访问集合和属性,但以后不能导航到对象子表,依此类推)。同样使用来自不同存储库的2个上下文,我们得到了一个异常,告诉我们2个上下文正在尝试将更改注册到同一对象。
由于要及时交付原型,因此我们为整个应用程序创建了一个静态dbContext共享,可以在需要时从任何地方调用它(控制器,模型,逻辑,DataAccess,数据库初始化器)。我们知道这是一个非常肮脏的解决方法,但是比以前的方法效果更好。
仍然存在问题:dbContext一次只能处理1个异步方法调用,并且我们可以有很多调用(例如,userManager.FindByNameAsync-只有异步方法)。例外:“在先前的异步操作完成之前,第二个操作在此上下文上启动”。
我们正在考虑将上下文创建为在控制器中调用动作的第一步,然后将该对象作为“中继竞赛”传递给所调用的所有其他层或函数。这样,连接将从“单击浏览器”开始,直到将响应重新加载到该连接上为止。但是我们不喜欢每个函数都必须有一个额外的参数“上下文”的想法,只是为了共享整个操作路径中各层的连接。
我们确信我们不是第一个想知道使用上下文的正确方法的人。
应用层
我们有这些(逻辑)层,不同的工作空间,但从上到下都是相同的webapp MVC项目:
视图: HTML + Razor + JQuery + CSS。此处的代码仅限于布局,但是某些HTML可能取决于Role。方法调用仅针对控制器,加上utils(如格式设置)。
ViewModels:在控制器和视图之间交换的数据容器。类仅定义属性,以及仅与域实体(译者)之间进行转换的函数。
控制器:从浏览器调用的操作导致对逻辑层中功能的调用。此处的身份验证限制了对操作的访问或操作内部的限制。控制器避免使用Domain实体,而避免使用ViewModels,以便与逻辑层进行通信,从而调用ViewModels转换函数。
域实体:用于逻辑层,并用于由实体框架创建数据库表。
逻辑类:域实体具有包含所有操作的EntityLogic类。这些是所有特定客户客户端通用和抽象的规则(ViewModel未知)的核心。
存储库:用于访问数据库。不确定我们是否确实需要这样做,因为Entity Framework已经将Domain实体映射到数据库中的对象。
典型场景
浏览器在产品控制器中调用操作(POST)以编辑产品。ProductViewModel用作数据的容器。
控制器操作仅限于角色集合。在动作内部,根据角色,将调用另一个Logic函数,并将ProductViewModel转换为ProductDomainEntity并作为参数传递。
逻辑EditProduct函数调用不同逻辑类中的其他函数,并且还使用本地化和安全性进行限制或过滤。逻辑可以调用或不调用存储库来访问数据,或为所有对象使用全局上下文,并将生成的域实体集合传递给逻辑。
根据结果,逻辑可能会或可能不会尝试浏览结果的子级集合。结果作为域实体(或的集合)返回给控制器操作,并且根据此结果,控制器可以调用更多Logic,或者重定向到另一个操作,或者使用将结果转换为正确ViewModel的View进行响应。
在哪里,何时何地以及如何创建dbContext以最佳方式支持整个操作?

更新:逻辑层中的所有类都是静态的。像这样从控制器调用方法:
UserLogic.GetCompanyUserRoles(user)
Run Code Online (Sandbox Code Playgroud)
, 要么
user.GetCompanyRoles()
Run Code Online (Sandbox Code Playgroud)
其中GetCompanyRoles()是在UserLogic中实现的User的扩展方法。因此,没有Logic类的实例意味着没有构造函数接收dbContext以便在其方法中使用。
我想让静态类中的静态方法知道在哪里将dbContext的实例激活到当前HttpRequest。
莫非NInject和OnePerRequestHttpModule帮助,这?有人尝试过吗?
例如,我有以下DbContext类。
public class AppDbContext : DbContext {
...
}
public class LogDbContext : DbContext {
...
}
public class FooDbContext : DbContext {
...
}
Run Code Online (Sandbox Code Playgroud)
如果名为的连接字符串AppDbContext位于上,App.Config并且我希望其他DbContext类共享与该字符串相同的连接字符串AppDbContext,我可以只将字符串“ AppDbContext”用作ctorof LogDbContext和的参数FooDbContext。例如,
public class FooDbContext : DbContext {
public FooDbContext : base("AppDbContext") { }
}
Run Code Online (Sandbox Code Playgroud)
有副作用吗?
在尝试了@ ShinH2S的建议和一些东西之后,我放弃了这种方式,并决定给出具有不同的connectionStrings和数据库的不同的Dbcontext派生类。我已经尝试了一个测试项目,并将其放在GitHub上。当entityframework检测到由于AppDbContext和FooDbContext模式具有不同的模式而导致数据库方案更改时,它将引发运行时异常。如果我DropCreateDatabaseIfModelChanges对两个DbContext派生类都分配了策略,则其中一个模型将被删除,因为模型彼此不同。
这是一个老问题。在我的内存中,EF6 and above versions同一迁移表中的多个上下文可以具有不同的迁移历史记录。我更喜欢SO的答案。我大约两年没有使用C#进行编码。
看着这样的问题这个我倾向于不使用几个dbcontexts.但是,看一些示例代码仍然会很好.是否有人知道使用多个dbcontexts和工作单元(以及可能的asp.net mvc)的企业级开源实现(c#)?
IdentityServer 4的新手。我在文档中的此处遵循IdentityServer4 EntityFramework示例。
运行迁移脚本后
dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb
dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb
Run Code Online (Sandbox Code Playgroud)
它可以工作,现在我的应用程序具有3个数据库上下文。
我的问题是这两个数据库上下文是做什么的?应用程序数据库上下文和其他两个上下文有什么区别?
如果我更新或添加任何模型,是否需要更新所有三个模型?或者什么时候应该在ApplicationDbContext上运行迁移,什么时候应该在其他两个上运行。
对此有任何见识或文献表示赞赏。谢谢。
c# ×5
asp.net-mvc ×2
dbcontext ×2
.net ×1
edmx ×1
entity ×1
linq ×1
orm ×1
persistence ×1
value-type ×1