尝试将ASP.NET Boilerplate项目升级.NET Core 1.x到.NET Core 2.0
解决方案构建成功,但在Startup.ConfigureServices方法中抛出异常
services.AddAbpIdentity<Tenant, User, Role, SecurityStampValidator>(
options => {})
.AddUserManager<UserManager>()
.AddRoleManager<RoleManager>()
.AddSignInManager<SignInManager>()
.AddClaimsPrincipalFactory<UserClaimsPrincipalFactory>()
.AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)
例外细节
System.TypeLoadException: '从组件 ' '未能加载类型' Microsoft.AspNetCore.Authentication.SharedAuthenticationOptions Microsoft.AspNetCore.Authentication,版本= 2.0.0.0,文化=中性公钥= adb9793829ddae60'.'
语境
目前我在文件和记录管理系统 (DRMS?) 中工作。由于一些技术限制,我需要存储一个“视图”文件和一个“源”文件(DOCX 或 XLSX)。视图文件是供用户打印、下载和查看日常使用的 PDF 文件,而源文件是可编辑文件。当用户需要更新一个文件时,他们会下载源,更新它,并上传一个新的视图文件和相应的源文件。
我目前无法实现 XLSX 查看器/编辑器,而且由于文件数量众多,我无法迁移到 ODF 以使用可用的开源查看器。
现在我有两个这样的模型:
public class Document {
//Other fields
public virtual List<DigitalFile> Files { get; set; }
}
public class DigitalFile {
//Other fields
public virtual Document FileOf { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
该Document模型具有所有“业务”数据,而DigitalFile模型具有有关文件本身的数据(路径、url、类型等)。
每次创建文档时,它都会有 1 个视图文件(必需),并且可能有 1 个源文件(某些文档可能不可编辑)。由此您可以知道,当创建/更新文档时,至少也会创建/更新 1 个数字文件。
问题/疑问
我将有一个DocumentAppService来处理所有的 CRUD 操作,但这就是我怀疑的地方,我应该从另一个 AppService 调用 AppService 吗?我的意思是,当创建一个 Document 时,Create 方法是否应该调用另一个 Create 方法DigitalFileAppService?或者如果DocumentAppService自己处理所有事情应该更好吗?
现在,DigitalFile 上的所有 CRUD 操作都与 Document …
我已经执行了 2 个工作(MyJob1和MyJob2),如下所示:
public async Task<ActionResult> ScheduleJob()
{
await _jobManager.ScheduleAsync<MyJob1>(
job =>
{
job.WithIdentity("Job1Identity", "MyGroup")
.WithDescription("This is job 1");
},
trigger =>
{
trigger.StartNow()
.WithSimpleSchedule(schedule =>
{
schedule.RepeatForever()
.WithIntervalInSeconds(5)
.Build();
});
});
await _jobManager.ScheduleAsync<MyJob2>(
job =>
{
job.WithIdentity("Job2Identity", "MyGroup")
.WithDescription("This is job 2");
},
trigger =>
{
trigger.StartNow()
.WithSimpleSchedule(schedule =>
{
schedule.RepeatForever()
.WithIntervalInSeconds(5)
.Build();
});
});
return Content("OK, scheduled!");
}
Run Code Online (Sandbox Code Playgroud)
--> 我曾尝试使用_jobManager.Stop() 但它停止了我的所有工作,那么如何仅停止或暂停 MyJob2?
我将aspnetboilerplate/aspnetzero模板用于我的Multi-Tenant SaaS应用程序和Multi-Database.这使用CastleWindsor作为DI Framework.
我遇到了非常糟糕的性能,我用dotTrace跟踪它 - 它说Castle.MicroKernel是最活跃的代码.
我的请求大约需要5-6秒,并且大部分时间都会超过控制器.(在调试时)我认为解析所有服务/控制器的速度很慢.我将一些依赖项(App-Services)从Transient更改为PerWebRequestLifetime,但它并没有影响性能.
有谁知道,我怎样才能获得更好的表现?
在我的视图(_Layout文件)中,我调用几个不同的Childactions,它们在Layoutcontroller上,此Controller获取以下服务注入:
public LayoutController(
IPerSessionCache sessionCache,
IUserNavigationManager userNavigationManager,
IMultiTenancyConfig multiTenancyConfig,
ILanguageManager languageManager,
ITenancyNameFinder tenancyNameFinder,
TenantManager tenantManager,
IUserLinkAppService userLinkAppService,
UserManager userManager)
Run Code Online (Sandbox Code Playgroud)
行动是
[ChildActionOnly]
public PartialViewResult AppHeader()
{
var headerModel = new Areas.Mpa.Models.Layout.HeaderViewModel
{
LoginInformations = AsyncHelper.RunSync(_sessionCache.GetCurrentLoginInformationsAsync),
Languages = _languageManager.GetLanguages(),
CurrentLanguage = _languageManager.CurrentLanguage,
IsMultiTenancyEnabled = _multiTenancyConfig.IsEnabled,
IsImpersonatedLogin = AbpSession.ImpersonatorUserId.HasValue,
HasLinkedAccounts = AsyncHelper.RunSync(_userLinkAppService.HasLinkedAccounts)
};
return PartialView("~/Views/Layout/_AppHeader.cshtml", headerModel);
}
[ChildActionOnly]
public PartialViewResult AppNavbar(string currentPageName = "")
{
var sidebarModel = new Areas.Mpa.Models.Layout.NavbarViewModel
{
Menu = AsyncHelper.RunSync(() => …Run Code Online (Sandbox Code Playgroud) asp.net-mvc dependency-injection castle-windsor aspnetboilerplate
我想从"数据"表中隔离"帐户"表,以便重用另一个应用程序.
我尝试使用.NET Core 2.0 + Angular模板,创建2个连接字符串,但是当创建另一个AbpDbContext时,我无法为上下文设置连接字符串.
在GitHub上使用多个DB上下文的示例使用.NET框架,而不是.NET核心,允许在dbcontext ctor上设置连接字符串.如何在.net core 2模板上执行此操作?
我使用以下代码进行了测试以更新Product:
var existing = await _productRepository.FirstOrDefaultAsync(c => c.Id == input.Id);
if (existing == null)
throw new UserFriendlyException(L("ProductNotExist"));
var updatedEntity = ObjectMapper.Map<Product>(input);
var entity = await _productRepository.UpdateAsync(updatedEntity);
Run Code Online (Sandbox Code Playgroud)
但这会引发异常:
Mvc.ExceptionHandling.AbpExceptionFilter-无法跟踪实体类型'Product'的实例,因为已经跟踪了另一个具有相同键值的{'Id'}实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。
这是由查询引起的existing。有什么解决办法吗?
c# entity-framework change-tracking asp.net-boilerplate aspnetboilerplate
我正在阅读本教程.我想使用asyncEF Core查询.
当我使用这样的时候它很好用:
var tasks = await _taskRepository
.GetAll()
//.WhereIf(!string.IsNullOrEmpty(input?.Title), x => x.Title.Contains(input.Title))
//.WhereIf(input?.State != null, x => x.State == input.State.Value)
//.OrderByDescending(x => x.CreationTime)
.ToListAsync();
Run Code Online (Sandbox Code Playgroud)
但我想使用whereif和orderby之类的
var tasks = await _taskRepository
.GetAll()
.WhereIf(!string.IsNullOrEmpty(input?.Title), x => x.Title.Contains(input.Title))
.WhereIf(input?.State != null, x => x.State == input.State.Value)
.OrderByDescending(x => x.CreationTime)
.ToListAsync();
Run Code Online (Sandbox Code Playgroud)
错误:
'IOrderedEnumerable'不包含'ToListAsync'的定义,并且没有可以找到接受类型'IOrderedEnumerable'的第一个参数的扩展方法'ToListAsync'(您是否缺少using指令或程序集引用?)
我想使用 ASP.NET Boilerplate 一次连接到两个数据库。我按照这个例子:https : //github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/MultipleDbContextEfCoreDemo
问题是只有第一个上下文才会有所有的 Abp 表。第二个上下文是现有数据库,其中没有任何 Abp 表。
当我启动 Web 应用程序时,我得到以下信息:
System.Data.SqlClient.SqlException: 'Invalid object name 'AbpLanguages'.'
Run Code Online (Sandbox Code Playgroud)
很明显,它正在第二个上下文中寻找 Abp* 表,但它们不存在(而且它们不应该存在)。那么,拥有多个上下文的正确方法是什么,这样它就不会在第二个上下文中查找 Abp* 表?
我通过修改从模板生成的干净的 ASP.NET Boilerplate 项目创建了一个示例应用程序。
我已经使用模板生成的项目进行了测试,该项目仅适用于 API,并且可以完美运行。但是当 API 和前端在生成项目时结合使用时,我会遇到这些问题,在其他上下文中查找 Abp* 表。
Dropbox:https
: //www.dropbox.com/s/19gj8ms0jwz500k/4.0.1.zip ? dl =0 Github:https : //github.com/FrikkinLazer/MultipleContext.git
c# dbcontext entity-framework-core asp.net-core aspnetboilerplate
我使用 aspnetboilerplate (MVC) 并希望实现忘记密码功能,以允许用户使用登录屏幕上的链接重置自己的密码。
我想这是通过生成密码重置代码然后通过电子邮件发送给用户来工作的。用户点击链接并被带到允许他们重置密码的屏幕。
我停留在初始阶段。在注意到尝试登录时返回了用户对象后,我从登录操作的副本开始。从这里我尝试设置密码重置代码。
[HttpPost]
[UnitOfWork]
public virtual async Task<JsonResult> ForgotPassword(ForgotPasswordViewModel forgotPasswordModel, string returnUrl = "", string returnUrlHash = "")
{
returnUrl = NormalizeReturnUrl(returnUrl);
if (!string.IsNullOrWhiteSpace(returnUrlHash))
{
returnUrl = returnUrl + returnUrlHash;
}
var loginResult = await _logInManager.LoginAsync(forgotPasswordModel.UsernameOrEmailAddress, "ForgotPassword", GetTenancyNameOrNull());
loginResult.User.SetNewPasswordResetCode();
switch (loginResult.Result)
{
case AbpLoginResultType.Success:
return Json(loginResult);
default:
throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(loginResult.Result, forgotPasswordModel.UsernameOrEmailAddress, GetTenancyNameOrNull());
}
}
Run Code Online (Sandbox Code Playgroud)
之后检查 AbpUser 表
loginResult.User.SetNewPasswordResetCode();
我看不到用户的任何密码重置代码,它们都是空的。
有人可以指出我正确的方向。
提前致谢
感谢下面的回答是正确的,只是为了完成下面的工作。显然忽略最后的json返回
public virtual async Task ForgotPassword(ForgotPasswordViewModel forgotPasswordModel, string returnUrl = "", string returnUrlHash = "") { …
我正在尝试将一条记录插入到自动生成 ID 的表中。出于这个原因,这是我的代码:
using (var context = new DbContext(GetConnection().Options))
{
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Customers ON;");
context.SaveChanges();
context.Customers.Add(customer);
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Customers OFF;");
}
Run Code Online (Sandbox Code Playgroud)
但例外总是一样的:
当 IDENTITY_INSERT 设置为 OFF 时,无法为表“Customers”中的标识列插入显式值。
我还尝试SET IDENTITY_INSERT dbo.Customers ON在 SQL Server Management Studio 中手动执行命令,并在执行上面的代码后,但抛出了相同的异常。
为什么?
c# ×6
.net-core ×2
asp.net-core ×2
asp.net-mvc ×2
.net ×1
abp ×1
dbcontext ×1
linq ×1
quartz.net ×1
sql-server ×1