使EF Core 2与仅具有吸气剂的属性一起使用,而没有支持字段 - c#

我的目标是使用以下代码使Entity Framework 2更好地发挥作用:

public class Foo
{
    public Guid Id { get; } // This should NOT change

    public string NotRequiredProperty {get; set;}

    public Foo(Guid id) => Id = id;

    private Foo() { } // Empty constructor is necessary for EF Core I believe?
}

我读过this blog post说可以完成以下操作:

// Class
private Guid _id;
public Guid Id => _id;

// Configuration
modelBuilder.Entity<Foo>()
.Property(b => b.Id)
.UsePropertyAccessMode(PropertyAccessMode.FieldDuringConstruction);

哪个可以工作。

我在这里看到的唯一改进是,即使{ get; }意味着隐式创建一个私有后备字段,我也必须明确声明一个私有后备字段。

如何使EF Core与{ get; }一起使用(当然还有一些必需的实体配置)

参考方案

使用EF Core 2.1引入的Entity types with constructors with parameters功能通常可以实现您的要求。您不再需要空的构造函数-EF Core将能够使用带有Guid id参数的构造函数。

但是,有两个限制适用于您的Id属性。首先,它是一个只读属性(因此由readonly字段支持,该字段只能从构造函数中进行设置)。如果您将其定义为private readonly Guid _id;,则在显式后备字段示例中的等效项将是。然后,示例配置将无法正常工作。

Read-only properties的文档部分说:

通过构造函数设置属性后,将其中一些属性设置为只读是有意义的。 EF Core支持此功能,但需要注意以下几点:

没有setter的属性不会按约定映射。 (这样做往往会映射不应映射的属性,例如计算的属性。)
使用自动生成的键值需要可读写的键属性,因为在插入新实体时,键生成器需要设置键值。

请注意第二个项目符号,因为这是第二个问题。按照惯例,Id属性是一个PK,并且惯例自动生成Guid和数字类型PK。

因此,您需要在两个选项之间进行选择-通过按链接中的建议通过添加Id来使private set;为非只读,或者(这是“我如何使EF Core能够与{ get; }“)使用以下流利的配置使其非自动生成:

modelBuilder.Entity<Foo>()
    .Property(e => e.Id)
    .ValueGeneratedNever();

使用Entity Framework Core(2.1)调用标量函数的最佳实践 - c#

我经常需要从Web应用程序(ASP.NET Core / EF Core)中调用在SQL Server上定义的标量函数。由于这些函数只是简单的辅助函数,因此我也使用了许多辅助函数,因此我使用了通用模式来调用这些标量函数-借助EF Core 2.1可用的新查询类型。由于我是EF Core的新手,所以我的问题是这种模式是否会引起问题,并且/或者是否存在调用标量函…

如何在EF Core 2.2中进行原始SQL查询? - c#

我正在使用dotnet core 2.x应用程序。我们有一堆“代码优先”的实体,并且在DBContext中为每个实体都有一个DBSet。例:public class MyContext : DBContext { public MyContext(DBContextOptions<MyContext> options) : base (optio…

如何在命令行上更改连接字符串以在迁移到Entity Framework Core中的新数据库时更新数据库 - c#

首先在ASP.NET Core和EF Core代码中,我有一个多租户的webapp。创建新租户时,我想更改连接字符串,在其上添加迁移,然后更新。从命令行,添加迁移无法在租户上获得动态的连接字符串,因此在应用程序首次以新租户开始时,我没有有效的连接字符串来创建新数据库。有什么解决办法吗?谢谢 参考方案 您在找这个吗?编辑:这是为EF 6.1Update-Dat…

ASP.NET Core-在Singleton注入上存储库依赖项注入失败 - c#

我正在使用SoapCore为我的ASP.NET Core MVC应用程序创建Web服务。我正在使用Entity Framework Core和简单的存储库模式来获取我的数据库数据。我通过Startup.cs中的.AddSingleton()注入存储库类:services.AddSingleton<IImportRepository, ImportRep…

ASP.NET Core Singleton实例与瞬态实例的性能 - c#

在ASP.NET Core依赖注入中,我只是想知道注册Singleton实例是否会比注册Transient实例更好地提高性能?在我看来,对于Singleton实例,创建新对象和相关对象只需花费一次时间。对于Transient实例,此成本将针对每个服务请求重复。因此Singleton似乎更好。但是,在Singleton上使用Transient时,我们可以获得多…