ASP.NET Core Entity Framework 中更新实体类

35

我使用ASP.NET Core中的Entity Framework从现有数据库中创建了这个模型。

这是Market表格的模型。

public partial class Market
{
        public Guid MarketId { get; set; }
        public string City { get; set; }
        public string CityF { get; set; }
        public string Name { get; set; }
        public string NameF { get; set; }
        public int SortOrder { get; set; }
        public bool IsActive { get; set; }
}

然而,我已经在数据库中将MarketId的数据类型更改为int。现在我想要更新这个模型。

找到一些链接,但是这些链接会创建一个全新的模型 https://learn.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db

我该如何在不创建新模型并使用appsettings.json中的连接字符串的情况下更新模型呢?


5
您可以在 Scaffold-DbContext 命令中使用 -force 标志。这样,您就可以强制重新生成覆盖现有的模型文件。 - Sanket
2
手动更改不是最佳选择。 - San Jaisy
1
@sanket - 你能否提供一个例子给我? - San Jaisy
3
@sanjaisy 这是一个示例命令 - Scaffold-DbContext "<ConnectionString>" Microsoft.EntityFrameworkCore.SqlServer -t <tablename> -f,请替换 ConnectionString 和 tablename。 - Sanket
2
另外请注意,每当您在数据库中进行更改(例如添加、删除或更改列)时,您都需要执行此操作... 当您强制进行脚手架更新时,您将失去对模型文件所做的任何修改,尽管我想不出为什么有人要这样做。 - Muqeet Khan
显示剩余4条评论
2个回答

45

一种选择是-

您可以使用Scaffold-DbContext命令并带有-force标志。这样,您可以强制脚手架覆盖现有的模型文件。

示例命令 -

Scaffold-DbContext "<ConnectionString>" Microsoft.EntityFrameworkCore.SqlServer -t <tablename> -f

根据您的需求替换ConnectionString和TableName。


这确实很有帮助。谢谢。 - Adrita Sharma
这在 ASP.NET Core 2.0 中也适用。如果上下文文件不在项目根目录中,它将自动在其中生成一个上下文文件。但是,新表的生成代码可以轻松地从 OnModelCreating 中移动,并删除额外的上下文。 - Alexei - check Codidact
如何以编程方式实现相同的操作? - Sagar Patil
@SagarPatil 您可以使用以下命令自动生成上下文:Scaffold-DbContext "Server=tcp:"SomeAzureConnectionString";Initial Catalog=(YoutDataBaseName);User ID=(YourUser);Password=(YourPassword);Trusted_Connection=False;Encrypt=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -f - Diego Venâncio

28

使用以下命令来更新整个 DbContext。有关更多详细信息,请参阅下面的链接。

"Build failed" on Database First Scaffold-DbContext

Scaffold-DbContext -Connection "Server=(local);Database=DefenderRRCart;Integrated Security=True;Trusted_Connection=True;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models -context RRStoreContext -Project RR.DataAccess -force

从Azure连接和本地连接进行更新

Scaffold-DbContext "Server=<Server Name>,1433;Initial Catalog=<Database Name>;Persist Security Info=False;User ID=<user id>;Password=<password>;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entity -context <Context Name> -Project <project Name> -force
创建新的上下文。
Scaffold-DbContext "Server=<Server Name>,1433;Initial Catalog=<Database Name>;Persist Security Info=False;
        User ID=<User Id>;Password=<Password>;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection
        Timeout=30;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir <Dir Name>

这怎么是正确答案?问题是关于更新单个实体,而答案却更新了整个dbContext。 - phifi
@phifi - 是的,你是正确的,它不会更新单个实体,它只会替换单个实体以及其他实体。 - San Jaisy
看起来你最初的问题在这里被跟踪作为EF的一个功能请求 https://github.com/aspnet/EntityFrameworkCore/issues/831 也许你想把这个加入到你的答案中? - phifi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接