所以我不能做这样的事情(仅作为一个例子):
ALTER TABLE [Customer]
ADD CONSTRAINT specify_either_phone_or_email
CHECK (([Phone] IS NOT NULL) OR ([Email] IS NOT NULL));
Run Code Online (Sandbox Code Playgroud)
这种情况有没有解决方法?
我知道:
思路
sqlite alter-table check-constraints database-schema entity-framework-core
我使用ASP.NET的核心,和EF核心,拥有SaveChanges和SaveChangesAsync.
在保存到数据库之前,在我的DbContext执行一些审计/日志记录中:
public async Task LogAndAuditAsync() {
// do async stuff
}
public override int SaveChanges {
/*await*/ LogAndAuditAsync(); // what do I do here???
return base.SaveChanges();
}
public override async Task<int> SaveChangesAsync {
await LogAndAuditAsync();
return await base.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
问题是同步SaveChanges().
我总是"一直异步",但这里不可能.我可以重新设计LogAndAudit(),LogAndAuditAsync()但这不是DRY,我需要更改十几个不属于我的主要代码.
关于这个主题还有很多其他问题,所有问题都是一般的,复杂的,充满争议.在这个具体案例中,我需要知道最安全的方法.
那么,在SaveChanges()没有死锁的情况下,如何安全地同步调用异步方法呢?
c# asynchronous entity-framework async-await entity-framework-core
我需要一个复合唯一约束来实现我的实体的Name属性,它是唯一的Category(对于它有一个FK).
所以像这样:
entityTypeBuilder
.HasIndex(i => new { i.Name, i.Category.Id })
.IsUnique();
Run Code Online (Sandbox Code Playgroud)
但是由于Category.Id导航属性,我在生成迁移时失败了.
我知道我可以将值硬编码为字符串,但我不想丢失静态类型.
我有什么选择?
entity-framework ef-migrations entity-framework-core ef-fluent-api
我正在使用 ASP.NET Core,带有内置容器。
自动注册应该像这样完成:
services.AddMvc();
services.AddMediatR(typeof(Startup));
Run Code Online (Sandbox Code Playgroud)
这会自动 1) 配置 MediatR,2) 注册程序集中找到的所有处理程序。
但我想手动注册我的处理程序。我怎么做?
在之前的EF中,我可以这样做:
entityTypeBuilder
.Property(b => b.Foo)
.IsRequired()
.HasMaxLength(10)
.IsFixedLength();
Run Code Online (Sandbox Code Playgroud)
这将产生类似的迁移
Foo = c.String(nullable: false, maxLength: 10, fixedLength: true)
Run Code Online (Sandbox Code Playgroud)
但是在EF Core中没有IsFixedLength().
还有其他方法吗?
entity-framework ef-code-first ef-migrations entity-framework-core ef-fluent-api
ASP.NET(和Core)控制器需要public.
问题是我有一个控制器,它依赖于(在它的构造函数中)某些东西internal.而且依赖性取决于内部的东西,这取决于内部的东西等等.所以我也需要制作控制器internal.
但是控制器工厂不会发现它.
有没有办法使internal控制器可被发现?
NLog允许我编写自定义目标.我想使用Entity Framework Core登录我的数据库.
在NLog.Targets.Target那里是这样的:
protected virtual void Write(LogEventInfo logEvent);
Run Code Online (Sandbox Code Playgroud)
但是我的代码是异步的,所以我必须这样做:
protected override async Task WriteAsync(LogEventInfo logEvent)
{
await WriteToEfContext(logEvent);
// and so on...
}
Run Code Online (Sandbox Code Playgroud)
但是没有Task WriteAsyncwrite方法的版本.
如何使用异步支持编写自定义目标?
我的命令:
public class Command : IRequest { ... }
Run Code Online (Sandbox Code Playgroud)
我的处理程序:
public class CommandHandler : IAsyncRequestHandler<Command> { ... }
Run Code Online (Sandbox Code Playgroud)
我的管道注册(不使用开放的泛型):
services.AddTransient<IPipelineBehavior<Command>, MyBehavior<Command>>();
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用:Using the generic type 'IPipelineBehavior<TRequest, TResponse>' requires 2 type arguments.并且存在相同的错误MyBehavior。
文档提到了Unitstruct。如何使用?
EF Core(就像之前的 EF 一样)会自动向模型添加带有 get/set 的属性。
我使用 Fluent API,我需要记住忽略它们,这会变得乏味 - 我总是会遇到运行时错误,因为我总是忘记。
我希望 EF 仅包含我已配置的那些属性。
如何禁用此约定?
c# ×6
asp.net-core ×4
mediatr ×3
cqrs ×2
.net-core ×1
alter-table ×1
asp.net ×1
async-await ×1
asynchronous ×1
nlog ×1
sqlite ×1