标签: ef-core-2.0

如何在实体框架核心中使用泛型类型?

如果我有一个看起来像这样的域模型:

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)

c# generics ef-core-2.0

7
推荐指数
2
解决办法
7357
查看次数

如何在 EF Core 中进行深度克隆/复制

我想做的是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 发生冲突。

有没有人熟悉这个以及我可能做错了什么?

deep-copy entity-framework-core ef-core-2.0

7
推荐指数
1
解决办法
2188
查看次数

使用 Entity Framework Core 2 将原始 SQL 映射存储过程结果到 POCO/DTO

我几乎到处寻找,但我很难找到解决方案。我花了一周时间使用存储过程创建了一个非常复杂的计算查询,我想从这个查询中获取结果并将其放入 POCO 类中,类似于我在使用 EF 6 之前所做的。

将存储过程列名映射到 POCO DTO

基本上是这样的:

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)

我读过这里的文献:

EF Core 查询原始 SQL

没有 DbSet 的原始 SQL 查询 - Entity Framework Core

并发现 EF Core 中不再有“免费 sql”了。FromSQL 基本上将结果投影到在数据库中找到的真实实体中,我不想要它,因为我没有找到具有相同列的表。相反,一种解决方案是扩展 DBContext,并创建一个新的 DBSet

但我真的不知道如何做到这一点。我有一个数据库优先模型,并使用了 Scaffold-DbContext:

使用现有数据库在 ASP.NET Core 上使用 EF Core

我不想添加到自动创建的上下文中,在我的情况下是 …

stored-procedures asp.net-core ef-core-2.0

7
推荐指数
1
解决办法
3361
查看次数

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)

c# entity-framework .net-core ef-core-2.0

7
推荐指数
1
解决办法
1345
查看次数

实体框架"SELECT IN"不使用参数

为什么在使用"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中.

.net c# sql-server entity-framework ef-core-2.0

7
推荐指数
1
解决办法
811
查看次数

为什么引用属性仅通过上下文起作用

我有两个类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)

c# ef-core-2.0

7
推荐指数
1
解决办法
237
查看次数

删除EF Core中的相关数据

具有一对多关系的两个实体,例如凭证具有许多凭证详细信息,问题是当从相关数据(凭证详细信息)集合中删除一项,然后保存更改时,实体不会从相关表中删除

删除过程如下所示:

    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)

entity-framework-core asp.net-core ef-core-2.0

7
推荐指数
1
解决办法
1万
查看次数

EF Core 2.0-两端具有所需FK的循环依赖

我有一个由两个实体组成的相当简单的数据模型:

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)

entity-framework circular-dependency ef-core-2.0

6
推荐指数
1
解决办法
1525
查看次数

由于InverseProperty模型而导致Asp.net Core 2.1崩溃

在第一次调用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)

c# entity-framework-core asp.net-core-2.0 ef-core-2.0

6
推荐指数
2
解决办法
902
查看次数

验证 30000 没有为小数列指定类型

在不使用属性的情况下指定小数精度的最佳方法是什么。我只需要在我的 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)

c# entity-framework ef-core-2.0

6
推荐指数
4
解决办法
3683
查看次数