假设实体Patient
存在于上下文中,该实体已使用数据库优先方法生成,因此我无法修改数据库。
public class Patient
{
public string Id { get; set; }
public string Surname { get; set; }
public string Forename { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想按姓名过滤患者,例如名字或姓氏或全名。我目前有以下查询:
await query
.Where(p => p.Forename != null && p.Forename.ToLower().Contains(filter) ||
p.Surname != null && p.Surname.ToLower().Contains(filter))
.ToListAsync();
Run Code Online (Sandbox Code Playgroud)
这显然只单独检查名字/姓氏列。如果过滤器是全名,则不起作用。
我尝试在 where 子句中进行字符串插值,以针对名字和姓氏的组合应用 contains 过滤器,但它在 ef 核心中不受支持并在本地执行。由于数据库中有超过一百万的患者,因此在应用程序中本地执行查询不是一种选择,必须在数据库中完成(搜索需要一分钟以上)。
有没有办法解决这个问题?
如何清理我的实体“包含”以重用同一组语句?我试图在保持 DRY 的同时重用一组 Includes。
前
_context.Accounts
.Include(x=> x.Status)
.Include(x=> x.Type)
.Include(x=> x.Phones)
.Include(x=> x.Users)
.Include(x=> x.Admins)
Run Code Online (Sandbox Code Playgroud)
后:
_context.Accounts.CustomIncludes()
Run Code Online (Sandbox Code Playgroud) 我有一个数据库表,其中一列是一IDENTITY
列(不是手动设置的主键)。我的 EF Core 模型如下所示:
public class Model
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
...Other fields...
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AnotherId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
尽管有注释,当我对表进行更新时,我发现生成的 SQL 尝试更新列IDENTITY
:
UPDATE [Model] SET ... [AnotherId] = @p10 ...
WHERE [Id] = @p29;
SELECT @@ROWCOUNT;
Run Code Online (Sandbox Code Playgroud)
这显然失败了,导致抛出异常。我正在使用 Entity Core 2.0,目前无法升级到 2.1。有什么想法为什么数据注释被忽略吗?
单独文件中的 EF CORE Fluent Api 配置适用于简单的类Ref #1 && Ref #2。当实体继承自KeyedEntity
或AuditableEntity
class abstract KeyedEntity<TValue> {
public TValue Id {get; set;}
}
class abstract AuditableEntity<TValue> : KeyedEntityBase<TValue>{
public DateTime DateCreated {get; set;}
public DateTime DateModified {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
映射器是这样的
public class KeyedEntityMap<TEntity, TId>
: IEntityTypeConfiguration<TEntity> where TEntity
: KeyedEntityBase<TId> where TId : struct
{
public void Configure(EntityTypeBuilder<TEntity> builder)
{
// Primary Key
builder.HasKey(t => t.Id);
// Properties
builder.Property(t => t.Id).HasColumnName("id").ValueGeneratedOnAdd();
}
}
public class AuditableEntityMap<TEntity, TId>
: …
Run Code Online (Sandbox Code Playgroud) c# entity-framework entity-framework-core asp.net-core ef-core-2.0
我使用 EF Core 并想添加预定义的数据。可以通过以下代码完成:
modelBuilder.Entity<UserPage>().HasData(new UserPage()
{
Name = "Homepage",
Editable = true,
Path = "path"
});
Run Code Online (Sandbox Code Playgroud)
这部分代码验证具有确切数据的 UserPage 对象是否存在,如果不存在,则创建它但我只想在记录Name = "Homepage"
不存在时添加新记录,否则不存在。即使名称为“主页”的记录已经存在,上面的代码也会添加新记录,但Editable = false
例如。我想验证它,我尝试:
if (UserPages.Where(p => p.Name.Equals("Homepage", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault() == null)
{
modelBuilder.Entity<UserPage>().HasData(new UserPage()
{
Name = "Homepage",
Editable = true,
Path = "path"
});
}
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误:
在创建模型时尝试使用该模型。DbContext 实例不能以任何使用正在创建的模型的方式在 OnModelCreating 中使用。
我刚刚开始使用EF Core和Net Core,遇到了一个我无法找到答案的问题.
我正在使用一个使用SQLite数据库进行存储的控制台应用程序.我现在正在测试一些东西并且使用上下文工作正常.我的示例程序运行正常.请注意,我最初使用迁移来创建数据库.
现在最终当我完成这个应用程序时,我想确保数据库存在.正如其他帖子所述,这应该是完成的ctx.Database.Migrate()
.但是,我无法访问此方法.所以我的问题是我需要做什么才能访问它?我错过了一个添加扩展方法的包吗?我需要配置更多东西吗?
请原谅这个非常基本的问题,但我找不到任何相关的问题.因此,如果我不知道在哪里看,我也会对阅读建议感到高兴.
using System;
using MyLog.NetCore.Models;
using MyLog.NetCore.DataAccess;
namespace MyLog.NetCore
{
internal class Program
{
#region Private Methods
private static void Main(string[] args)
{
using (var ctx = new MyLogContext())
{
ctx.Add(new PartialLogEntry { PartialLogEntryID = 1, StartDateTime = 1, Title = "Test" });
var count = ctx.SaveChanges();
Console.WriteLine($"{count} changes saved to database!");
Console.WriteLine();
Console.WriteLine("All partial lof entries in database:");
foreach (var entry in ctx.PartialLogEntries)
{
Console.WriteLine($"ID: {entry.PartialLogEntryID}\tStart: {entry.StartDateTime}\tTitle: {entry.Title}");
}
}
Console.ReadLine();
} …
Run Code Online (Sandbox Code Playgroud) 我有一个现有表Projects
,我想向其中添加一个UserId
列,其中UserId
有一个外键。 Projects
现在有一个名称列表,但我希望每个用户都可以管理自己的项目。我最初拥有“孤儿”是可以的,因为列表足够小,我可以手动清理它们。
我已经更新了模型以包含UserId
和导航属性User
(可能不相关,但是Entity
这里是带有Id
和的基类DateModified
)
public class Project : Entity
{
public string Name { get; set; }
public Guid? UserId { get; set; } //tried this as nullable and non nullable
public User User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我相关的映射文件是
public class ProjectMap : IEntityTypeConfiguration<Project>
{
public void Configure(EntityTypeBuilder<Project> builder)
{
builder.Property(x => x.Name).IsRequired();
builder.Property(x => x.UserId).IsRequired();
builder.HasOne(x => x.User)
.WithMany(x => x.Projects)
.HasForeignKey(x …
Run Code Online (Sandbox Code Playgroud) 这是我的代码:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("AppDbContext"));
});
services.AddMvc();
}
Run Code Online (Sandbox Code Playgroud)
这是我的 DbContext:
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
public DbSet<Actor> Actors { get; set; }
public DbSet<Movie> Movies { get; set; }
public DbSet<MovieActor> MovieActors { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的 ConnectionString 很好。我真的很想知道为什么我的数据库在运行这段代码时没有生成?断点正在行中,services.AddDbContext
但是当我在AppDbContext
其中放置断点时没有命中。有人可以帮忙吗?我的代码看起来像这样https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro
我正在尝试使用eshoponweb示例应用程序在Net Core 2.1中创建MVC应用程序。我已经读过,在实体框架核心中,放入存储库层并直接使用ef dbcontext没有太大好处。我将如何在干净的建筑场景中做到这一点。在示例应用程序中,dB上下文位于基础结构层中,而业务服务逻辑全部位于应用程序核心中。我曾考虑过将其中任何一个都搬走,但那不会阻止干净的架构想要实现的分离。https://github.com/dotnet-architecture/eShopOnWeb和https://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework-core/
我试图通过使用EF Core 2.0在两个类之间建立多对多关系,方法是在每个类中仅包含另一个ICollection。
在EF 6中,这似乎很好用(请参阅本教程)。为什么这在EF Core中不起作用?
public class ClassA {
[...]
public ICollection<ClassB> Bs { get; set; }
}
public class ClassB {
[...]
public ICollection<ClassA> As { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我在EF核心中找到了一种方法来执行此操作(请参阅本教程),但这看起来比需要的更多人工工作。
有谁知道他们是否打算在不久的将来对此提供支持?
ef-core-2.0 ×10
c# ×7
.net-core ×3
asp.net-core ×3
architecture ×1
ef-core-2.1 ×1
seed ×1
sql-server ×1
sqlite ×1
structure ×1