如果我有一个看起来像这样的域模型:
public class Foo<T> {
public Guid Id { get; set; }
public string Statement { get; set; }
public T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想将它用于内置数据类型(字符串、整数等...)以及日期。我想像这样使用它:
var foo = new Foo<string>();
foo.Value = "Hey";
Run Code Online (Sandbox Code Playgroud)
如何使用 EF Core 将其保存到数据库中?
我想数据库表看起来像
| Id | Statement | ValueAsString | ValueAsDecimal | ValueAsDate | ValueAsInt |
| 1 | NULL | "Hey" | | | |
| 2 | NULL | | 1.1 | | |
Run Code Online (Sandbox Code Playgroud) 我想做的是School
在 EF Core 中复制/复制我的对象及其所有子项/关联
我有如下内容:
var item = await _db.School
.AsNoTracking()
.Include(x => x.Students)
.Include(x => x.Teachers)
.Include(x => x.StudentClasses)
.ThenInclude(x => x.Class)
.FirstOrDefaultAsync(x => x.Id == schoolId);
Run Code Online (Sandbox Code Playgroud)
我一直在阅读深度克隆,似乎我应该能够只添加实体......所以几乎是下一行。
await _db.AddAsync(item);
Run Code Online (Sandbox Code Playgroud)
然后 EF 应该足够聪明,可以将该实体添加为新实体。但是,马上我就遇到了一个冲突,说“id {schoolId} 已经存在”并且不会插入。即使我重置了我尝试添加的新项目的 Id,我仍然会与学校 itam 的协会/孩子的 Id 发生冲突。
有没有人熟悉这个以及我可能做错了什么?
我几乎到处寻找,但我很难找到解决方案。我花了一周时间使用存储过程创建了一个非常复杂的计算查询,我想从这个查询中获取结果并将其放入 POCO 类中,类似于我在使用 EF 6 之前所做的。
基本上是这样的:
var p1 = new SqlParameter { ParameterName = "Param1", Value = 1 };
var p2 = new SqlParameter { ParameterName = "Param2", Value = 2 };
string query = "EXEC Calcs_Selections @Param1, @Param2";
var calcs = context.Database.SqlQuery<CalcViewPOCO>(query, p1, p2).ToList();
Run Code Online (Sandbox Code Playgroud)
我读过这里的文献:
没有 DbSet 的原始 SQL 查询 - Entity Framework Core
并发现 EF Core 中不再有“免费 sql”了。FromSQL 基本上将结果投影到在数据库中找到的真实实体中,我不想要它,因为我没有找到具有相同列的表。相反,一种解决方案是扩展 DBContext,并创建一个新的 DBSet
但我真的不知道如何做到这一点。我有一个数据库优先模型,并使用了 Scaffold-DbContext:
使用现有数据库在 ASP.NET Core 上使用 EF Core
我不想添加到自动创建的上下文中,在我的情况下是 …
在EF核心中,我试图用子集合来计划结果集.
ctx.As.Select(a => new
{
AId = a.Id,
BNames = a.Bs.Select(x=>x.Name) //SubCollection
})
Run Code Online (Sandbox Code Playgroud)
但是当执行此操作时,BNames集合是惰性的,因此当它被枚举时,它会触发每行的单独查询.例如,B集合中的2个项目.
[a].[Id] AS [AId] FROM [As] AS [a]
p_executesql N'SELECT [x].[Name]
FROM [Bs] AS [x]
WHERE @_outer_Id = [x].[AId]',N'@_outer_Id int',@_outer_Id=1
p_executesql N'SELECT [x].[Name]
FROM [Bs] AS [x]
WHERE @_outer_Id = [x].[AId]',N'@_outer_Id int',@_outer_Id=2
Run Code Online (Sandbox Code Playgroud)
在EF6中,相同的查询会产生以下结果(正如我所料):
SELECT
[Extent1].[Id] AS [Id],
[Project1].[C1] AS [C1],
[Project1].[Name] AS [Name]
FROM [dbo].[A] AS [Extent1]
LEFT OUTER JOIN (SELECT
[Extent2].[Name] AS [Name],
[Extent2].[A_Id] AS [A_Id],
1 AS [C1]
FROM [dbo].[B] AS [Extent2] ) AS [Project1] …
Run Code Online (Sandbox Code Playgroud) 为什么在使用"SELECT IN"时,Entity Framework将文字值放在生成的SQL中而不是使用参数:
using (var context = new TestContext())
{
var values = new int[] { 1, 2, 3 };
var query = context.Things.Where(x => values.Contains(x.Id));
Console.WriteLine(query.ToString());
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下SQL:
SELECT
[Extent1].[Id] AS [Id]
FROM [dbo].[PaymentConfigurations] AS [Extent1]
WHERE [Extent1].[Id] IN (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
我在SQL Server中看到了很多缓存的查询计划.有没有让EF放置参数而不是编码值,或者激活参数嗅探是唯一的选择?
它也发生在EF Core中.
我有两个类Order和OrderDetail:
public class Order : Entity
{
public Order(KitchenAppContext context) : base(context)
{
}
public Order() : base()
{
}
public DateTime Date { get; set; }
public Guid MenuId { get; set; }
public virtual Menu Menu { get; set; }
public bool IsClosed { get; set; }
public decimal Price { get; set; }
public virtual int PeopleCount { get { return Details.Count; } }
public virtual List<OrderDetail> Details { get; set; } = new List<OrderDetail>();
}
public …
Run Code Online (Sandbox Code Playgroud) 具有一对多关系的两个实体,例如凭证具有许多凭证详细信息,问题是当从相关数据(凭证详细信息)集合中删除一项,然后保存更改时,实体不会从相关表中删除
删除过程如下所示:
var voucher = await _voucherRepository.GetCompleteVoucherAsync(Id);
var item = voucher.VoucherDetails.FirstOrDefault();
voucher.VoucherDetails.Remove(item);
_dbContext.Update(voucher);
await _dbContext.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)
模型看起来像:
public class Voucher : BaseEntity
{
public int Id {get; set;}
-----
public ICollection<VoucherDetail> VoucherDetails { get; set; }
}
public class VoucherDetail : BaseEntity
{
public int Id {get; set;}
-----
public int VoucherId { get; set; }
public Voucher Voucher { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是上下文:
builder.HasOne(i => i.Voucher)
.WithMany(i => i.VoucherDetails)
.IsRequired().HasForeignKey(i => i.VoucherId)
.OnDelete(DeleteBehavior.Cascade);
Run Code Online (Sandbox Code Playgroud)
存储库:
public async Task<Voucher> GetCompleteVoucherAsync(int id) …
Run Code Online (Sandbox Code Playgroud) 我有一个由两个实体组成的相当简单的数据模型:
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) 在第一次调用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) 在不使用属性的情况下指定小数精度的最佳方法是什么。我只需要在我的 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) ef-core-2.0 ×10
c# ×6
asp.net-core ×2
.net ×1
.net-core ×1
deep-copy ×1
generics ×1
sql-server ×1