当我使用 DataSet 时,有可能引发 RowChanging、RowChanged、ColumnChanging、ColumnChanged 等事件...
如何对实体框架中的实体执行相同的操作?
当我们使用实体框架作为数据层时,我们能否获得SQL Server 2010表分区的好处?该表每天将有 10,000 条记录,并将按创建日期进行分区(例如:- 超过 30 天的记录和新的记录)
我正在调用存储过程:
ObjectResult<ComplexType1> result = context.ListSomething(model.SelectedDatabase);
ViewBag.WebGrid = new WebGrid(source: result, rowsPerPage: int.MaxValue, canSort: false, canPage: false);
Run Code Online (Sandbox Code Playgroud)
但是,当将结果作为源传递给WebGrid时,我收到:
System.InvalidOperationException:不能多次枚举查询结果。
我有点惊讶,因为ObjectResult实现了IEnumerable(不是IQueryable)。该异常背后的背景是什么以及为什么我必须调用ToList()方法:
var result = context.ListSomething(model.SelectedDatabase).ToList();
ViewBag.WebGrid = new WebGrid(source: result, rowsPerPage: int.MaxValue, canSort: false, canPage: false);
Run Code Online (Sandbox Code Playgroud)
让它发挥作用?您能否为我提供一些解释它的文档(例如,来自《编程实体框架,第二版》,正如我现在正在阅读的那样,但到目前为止我不记得任何可以解释该机制的内容)。
谢谢,帕维尔
我正在使用实体框架。我有一个表 Person,它在表 PersonCategory 上有一个外键。Person Id 是一个自动递增的身份 (1,1)。每次我更新人员实体时,实体框架都会为 PersonCategory 表插入一行,即使找到类别也是如此。
我正在使用数据库优先设计。
class Person
{
public string Name {get;set}
public PersonCategory {get;set;}
}
class PersonCategory
{
public int ID {get;set}
public string Name{get;set;}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个支持本地化的域模型。我查看了之前提出的一些问题,但我不太喜欢所提出的解决方案。例如,在这个问题中,我认为为每个应该支持本地化数据的实体创建一个额外的实体是多余的。我宁愿将所有实体的本地化数据放在一个实体中,其唯一目的是保存本地化数据。
我建议的解决方案如下:
创建一个LocalizedEntity类,所有应支持本地化的实体都将从该类继承。
创建一个LocalizedData基本上保留实际本地化文化价值观的实体。
更新:
public class LocalizedEntity
{
public String Code { get; set; }
}
public enum ResourceType
{
CityName,
CityDescription,
StreetName,
AreaName
//others...
}
public class LocalizedData
{
public Int32 Id { get; set; }
public String Code { get; set; }
public ResourceType Type { get; set; }
public Int32 CultureId { get; set; }
public String Value { get; set; }
}
public class City : LocalizedEntity
{
public …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用 ASP.NET Core 构建我的第一个 API 项目。
一切都很顺利,除了一件事。每当我尝试添加一个新的脚手架控制器时(当然是在添加我的模型之后),我会收到以下错误:
属性“Favor.Coordinates”属于“Geometry”类型,当前数据库提供程序不支持该属性。使用“[NotMapped]”特性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”更改属性 CLR 类型或忽略该属性。
这是不言自明的;我有一个Geometry类型(来自 Postgis)的模型类,这似乎导致了实体框架的问题。
我做了什么?
Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite包以支持Geometry我的项目,如以下教程中所述:https : //docs.microsoft.com/en-us/ef/core/modeling/spatial值得一提的是NetTopologySuite,正如教程中提到的,我还在生成模型之前添加了该包。然而,每当我尝试使用实体框架添加脚手架 API 控制器时,我都会收到上述错误,尽管 NTS 确实支持 Geometry.
为了进一步参考,这里Favor是错误提到的类:
using System;
using System.Collections.Generic;
using NetTopologySuite.Geometries;
namespace FavorAPI.Models
{
public partial class Favor
{
public Favor()
{
Payment = new HashSet<Payment>();
Request = new HashSet<Request>();
}
public int Idfavor { get; set; }
public …Run Code Online (Sandbox Code Playgroud) 我正在遵循有关如何设置 EF Core 以在 Blazor 和 .NET Core 3.1 中安全工作的指南。MS 文档在这里:https : //docs.microsoft.com/en-us/aspnet/core/blazor/blazor-server-ef-core?view=aspnetcore-3.1
在说明中,建议创建一个 DbContextFactory,用于在每个服务中创建一个 dbcontext。在 Blazor 世界中一切都有意义,但代码不会编译,因为 AddDbContextFactory 不存在。如果在 .Net Core 3.1/EF Core 3 中有另一种方法可以做到这一点 - 我看不到它。
services.AddDbContextFactory<ContactContext>(opt =>
opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db")
.EnableSensitiveDataLogging());
Run Code Online (Sandbox Code Playgroud) 如何在 db 上下文中获取 Entity Framework Core 中所有表的列表?
以下答案适用于 Entity Framework 5 中的先前版本,我们目前使用的是 EF Core 3。
var tableNames = context.MetadataWorkspace.GetItems(DataSpace.SSpace)
.Select(t => t.Name)
.ToList();
Run Code Online (Sandbox Code Playgroud)
我们只想在带有 EF Core 的报告中显示所有数据库。原始 Sql 是select * from sys.tables or information_schema.tables,但是正在寻找 EFCore 方式
c# entity-framework entity-framework-core .net-core asp.net-core
C# 9 引入了记录和init-only 属性,以便更轻松地编写不可变的引用对象。
我一直在尝试将旧的 Entity Framework 项目转换为使用这些功能,但在具有 init-only 属性的不可变 C# 记录和尝试对底层 SQL 记录进行更改之间遇到了一些摩擦。
也许我只是在推动流程,但是是否有一种模式可以将您的 C# 类定义为不可变的 init-only 记录,但仍然允许更新底层 SQL 数据?
我当前使用可变类的(工作)代码:
MyReport.cs
namespace MyNamespace
{
public sealed class MyReport
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ReportId { get; set; }
public DateTime ReportDate { get; set; }
public bool ReadyToUse { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序
using (var dbContext = DbContext.Create(connectionString))
{
// create a new report
var myReport = new MyReport
{ …Run Code Online (Sandbox Code Playgroud) 我最近发现了全局过滤器,这很棒,因为我的任务是在我的应用程序中实现软删除。目前我已经这样做了:
// Query filters https://docs.microsoft.com/en-us/ef/core/querying/filters
modelBuilder.Entity<Address>().HasQueryFilter(m => !m.Deleted);
modelBuilder.Entity<Attribute>().HasQueryFilter(m => !m.Deleted);
modelBuilder.Entity<Brand>().HasQueryFilter(m => !m.Deleted);
modelBuilder.Entity<BrandAddress>().HasQueryFilter(m => !m.Deleted);
modelBuilder.Entity<BrandCategory>().HasQueryFilter(m => !m.Deleted);
modelBuilder.Entity<Category>().HasQueryFilter(m => !m.Deleted);
// many more entity types....
Run Code Online (Sandbox Code Playgroud)
所有实体都继承了一个BaseModel看起来像这样的:
public class BaseModel
{
public Guid CreatedBy { get; set; }
public Guid UpdatedBy { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateUpdated { get; set; }
public bool Deleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
是否可以为继承BaseModel? 的任何类添加查询过滤器?就像是:
modelBuilder.Entity<BaseModel>().HasQueryFilter(m => !m.Deleted);
Run Code Online (Sandbox Code Playgroud)
所以我不会忘记(稍后)为我添加的模型添加查询过滤器?
entity-framework ×10
c# ×7
.net-core ×2
.net ×1
asp.net ×1
asp.net-core ×1
blazor ×1
c#-9.0 ×1
dataset ×1
geometry ×1
linq ×1
localization ×1
postgis ×1
sql-server ×1