我有一个由两个实体组成的相当简单的数据模型:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int CurrentLocationId { get; set; }
public List<Location> Locations { get; set; }
public Location CurrentLocation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和
public class Location
{
public int Id { get; set; }
[Required]
public int UserId { get; set; }
public string Address { get; set; }
public User User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
为了成功运行迁移,我需要以下模型构建器代码:
builder.Entity<Location>()
.HasOne(x => …
Run Code Online (Sandbox Code Playgroud) 在使用EFCore加密SQLite数据库时,我遇到了这个GitHub问题
请参阅8月1日bricelam的评论.此问题解释了如何使用efcore加密SQLite数据库.它指的是Microsoft.EntityFrameworkCore.Sqlite.Core.然而,还有另一个软件包"Microsoft.EntityFrameworkCore.Sqlite",它在许多微软文档中被广泛使用和引用.我想知道这两个组件之间的区别,我应该使用哪个组件?
如果我使用Microsoft.EntityFrameworkCore.Sqlite.Core,我会错过任何功能吗?
我在我的项目中使用Entity Framework Core,使用命令创建了一个DbContext类
\n\nPM> Scaffold-DbContext "Server=servername;Database=DBname;User Id=user;Password=password;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context QuestionnaireEntities -Tables Category_Master,Item,Option_Master,Question_Master,Sub_Category_Master,Sub_Item\n
Run Code Online (Sandbox Code Playgroud)\n\n它完美地创建了 DBContext 类,但是如果我想从数据库更新我的 DBContext,而不是在 EFcore 中执行此操作,在 EF 中只需右键单击并选择选项更新从数据库即可轻松完成
\n\n另外,我如何在 DBContext 类中使用存储过程
\n\n在msdn网站上他们提到了一个命令
\n\n\n\n\nPM> get-helpscaffold-dbcontext\xe2\x80\x93详细
\n
但它没有任何有关更新 DBContext 和在其中添加存储过程的信息
\n\n我如何在 EF Core 中执行此操作\n我正在使用带有 .Net core 2.0 和 EFcore 2.0 的 VS 2017 社区版
\n我已经使用来添加了迁移Add-Migration
,现在,如果运行Remove-Migration
,它将恢复迁移并成功删除生成的迁移文件,但是在Package Manager控制台中也会显示错误。我不知道它背后的确切原因和副作用。这是EF Core错误吗?
包管理器输出:
PM>移除迁移移除迁移'20180320052521_testMigration'。还原模型快照。做完了 异常调用参数“ 0”的“ Remove”:“词典中不存在给定的键。” 下午>
EF核心版本: 2.0.1
c# entity-framework-core asp.net-core asp.net-core-2.0 ef-core-2.0
在第一次调用DbContext时,System.Reflection中一个非常长的未处理异常导致我的网站在加载时崩溃。
使用ef-core 2.1 rc1
System.ArgumentNullException: Value cannot be null.
Parameter name: type
at System.Reflection.IntrospectionExtensions.GetTypeInfo(Type type)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.InversePropertyAttributeConvention.ConfigureInverseNavigation(InternalEntityTypeBuilder entityTypeBuilder, MemberInfo navigationMemberInfo, InternalEntityTypeBuilder targetEntityTypeBuilder, InversePropertyAttribute attribute)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.InversePropertyAttributeConvention.Apply(InternalEntityTypeBuilder entityTypeBuilder, PropertyInfo navigationPropertyInfo, Type targetClrType, InversePropertyAttribute attribute)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.NavigationAttributeEntityTypeConvention`1.Apply(InternalEntityTypeBuilder entityTypeBuilder)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ImmediateConventionScope.OnEntityTypeAdded(InternalEntityTypeBuilder entityTypeBuilder)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.RunVisitor.VisitOnEntityTypeAdded(OnEntityTypeAddedNode node)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.OnEntityTypeAddedNode.Accept(ConventionVisitor visitor)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ConventionVisitor.Visit(ConventionNode node)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ConventionVisitor.VisitConventionScope(ConventionScope node)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ConventionBatch.Run()
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ConventionBatch.Dispose()
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.RelationshipDiscoveryConvention.DiscoverRelationships(InternalEntityTypeBuilder entityTypeBuilder)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.RelationshipDiscoveryConvention.Apply(InternalEntityTypeBuilder entityTypeBuilder)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ImmediateConventionScope.OnEntityTypeAdded(InternalEntityTypeBuilder entityTypeBuilder)
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.OnEntityTypeAdded(InternalEntityTypeBuilder entityTypeBuilder)
at Microsoft.EntityFrameworkCore.Metadata.Internal.Model.AddEntityType(EntityType entityType)
at Microsoft.EntityFrameworkCore.Metadata.Internal.Model.AddEntityType(Type type, ConfigurationSource configurationSource)
at Microsoft.EntityFrameworkCore.Metadata.Internal.InternalModelBuilder.Entity(TypeIdentity& type, ConfigurationSource configurationSource, …
Run Code Online (Sandbox Code Playgroud) 我有一个多语言实体(翻译后的字符串存储在单独的表中),我想过滤当前 UI 文化的翻译后的字符串。如果当前 UI 文化没有翻译的字符串,我想获取并过滤实体的第一个默认翻译字符串。
我正在使用 .NET Core 2.1、EF Core 2.1 和 ABP Boilerplate 3.6.2 框架。
这是我的代码。此功能是过滤DocumentCategory横跨实体名称的财产DocumentCategoryTranslation相关实体。如果有的话,我采用当前的 UI 文化翻译字符串,否则我采用第一个。返回的对象只是我的结果的包装器。
public async Task<PagedResultDto<GetDocumentCategoryForView>> GetAll(GetAllDocumentCategoriesInput input)
{
var query = (from dc in _documentCategoryRepository.GetAllIncluding(dc => dc.Translations)
select new
{
dc,
t = dc.Translations.FirstOrDefault(t => t.Language == CultureInfo.CurrentUICulture.Name) ?? dc.Translations.First()
}).AsQueryable()
.WhereIf(!string.IsNullOrWhiteSpace(input.Filter), e => false || e.t.Name.ToLower().Contains(input.Filter.ToLower()));
var result = await query.ToListAsync();
return new PagedResultDto<GetDocumentCategoryForView>(
result.Count,
result.Select(o => new GetDocumentCategoryForView()
{
DocumentCategory = ObjectMapper.Map<DocumentCategoryDto>(o.dc)
}).ToList()
);
} …
Run Code Online (Sandbox Code Playgroud) 我在 MySql 服务器上使用来自 MySql 的 Sakila 示例数据库。该图如下所示。
重要的表是store、inventory和film表。该是多到许多表和关系连接表是库存表。
我使用EFCore 2在一个新的 dotnetcore 项目中搭建了这个数据库。我正在尝试获取商店列表及其电影列表。
所述实体定义如下:
店铺
public class Store
{
public Store()
{
Customer = new HashSet<Customer>();
Inventory = new HashSet<Inventory>();
Staff = new HashSet<Staff>();
}
public byte StoreId { get; set; }
public byte ManagerStaffId { get; set; }
public short AddressId { get; set; }
public DateTimeOffset LastUpdate …
Run Code Online (Sandbox Code Playgroud) 在我们的系统中,我们在 EF 核心中使用 QueryFilters 时遇到了性能问题。问题在于 EF 核心过滤器在 LEFT JOIN 内部进行过滤,而不是在其外部进行过滤。
生成的 SQL 看起来像这样:
SELECT [pom].[Id],
[pom].[DeleteDate],
[pom].[UpdateDate],
[pom].[Version],
[t].[Id],
[t].[MandatorId],
[t].[NetPriceAmount],
[t].[NetPriceCurrencyIso4217Code]
FROM [externaldata].[PurchaseOfferMetadata] AS [pom]
LEFT JOIN (
SELECT [po].[Id],
[po].[MandatorId],
[po].[NetPriceAmount],
[po].[NetPriceCurrencyIso4217Code]
FROM [externaldata].[PurchaseOffer] AS [po]
WHERE [po].[MandatorId] = 1
) AS [t] ON [pom].[Id] = [t].[Id]
WHERE [pom].[Id] IN
(CAST(3094411 AS bigint),
CAST(4757070 AS bigint),
CAST(4757112 AS bigint),
CAST(5571232 AS bigint))
Run Code Online (Sandbox Code Playgroud)
有问题的部分是WHERE [po].[MandatorId] = 1
. 如果这是在第二个WHERE
语句中,则查询运行得更快。
数据库模型配置如下:
modelBuilder.Entity<PurchaseOffer>()
.HasQueryFilter(po => po.MandatorId == 1) …
Run Code Online (Sandbox Code Playgroud) 我想并行执行几个 SELECT 存储过程调用。我设置我的上下文如下:
public virtual DbSet<Task<GetCaseCaseContextModel>> CaseGetCaseContextData { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后我的 repo 类执行以下操作:
public async Task<List<GetCaseNotesContextModel>> GetCaseNotes(string caseId)
{
var notes = _context.CaseGetCaseContextData.FromSql("x_Fortellis_CaseGetCaseNotes @p0", caseId, caseId).ToListAsync();
return notes;
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
严重性代码描述项目文件行抑制状态错误CS0029无法隐式转换类型'System.Threading.Tasks.Task<System.Collections.Generic.List<System.Threading.Tasks.Task<CaseManagement.Infrastruct.Database.Repo.Case.GetCase .GetCaseCaseContextModel>>>' 到 'System.Collections.Generic.List<CaseManagement.Infrastruct.Database.Repo.Case.GetCase.GetCaseNotesContextModel>' CaseManagement.Infrastruct.Database C:\Dev\Bitbucket\webscv\Fortellis\CaseManagement\CaseManagement .Infrustruct.Database\Repo\Case\GetCase\GetCaseRepoHelper.cs 72 活动
当我将上下文更改为:
public virtual Task<DbSet<GetCaseCaseContextModel>> CaseGetCaseContextData { get; set; }
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
严重性代码说明项目文件行抑制状态错误 CS1061“Task<DbSet>”不包含“FromSql”的定义,并且找不到接受类型“Task<DbSet>”的第一个参数的可访问扩展方法“FromSql”(是您缺少 using 指令或程序集引用吗?) CaseManagement.Infrastruct.Database C:\Dev\Bitbucket\webscv\Fortellis\CaseManagement\CaseManagement.Infrustruct.Database\Repo\Case\GetCase\GetCaseRepoHelper.cs 70 活动
我最终想使用以下方式致电他们:
GetCaseCaseContextModel caseData = new GetCaseCaseContextModel();
List<GetCaseNotesContextModel> notes = new List<GetCaseNotesContextModel>();
Parallel.Invoke(
async () => caseData = await GetCaseData(caseId, dealerGroupId),
async () …
Run Code Online (Sandbox Code Playgroud) 在不使用属性的情况下指定小数精度的最佳方法是什么。我只需要在我的 Data.Models 中将所有小数设置在一个位置。其繁琐的为每个小数指定属性。
public class Customer
{
public int customerId{ get; set; }
[Column(TypeName = "decimal(18,2)")]
public decimal AvailableAmount{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)