创建新的数据表并保留已有的表?

15

我在一个C#项目中搭建了几个表格。现在我需要搭建一个新的表格。我不想重新搭建已存在的表格,因为它们发生了一些变化。

Scaffold-DbContext "Server=...;Database=...;...;" Microsoft.EntityFrameworkCore.SqlServer `
-OutputDir Models -Tables newTable

使用该命令会出现以下错误:

文件myContext.cs和newTable.cs已经存在于目录C:\Users....\Models中,请使用Force标志以覆盖这些文件。

使用-Force将覆盖现有表的现有代码。


只需使用Entity Framework 6 Power Tools或其EF-core版本即可。 - Gert Arnold
4个回答

22
我希望系统内置一种添加实体并更新现有上下文的方法,但好像没有。我通过在包管理器控制台中使用--context选项,并给它一个临时名称(例如--context TempContext)来克服这个问题。这样做可以生成新表和临时上下文。然后,我只是从临时上下文的OnModelCreating方法中复制了public virtual DbSet<NewEntityType> NewEntityType { get; set; }属性和modelBuilder.Entity<NewEntityType>(entity =>块到我的现有上下文中。之后,我删除了临时上下文。这相当简单明了。

5

这将帮助您更改现有的DbContext文件。

如果您创建了一个新表,则New Class(entities)将在Models文件夹中创建,如果您删除现有的表,则会删除Models文件夹中的class(entities)。

对于软件包管理器控制台

BloggingContext是我的自己的数据库上下文文件,您必须按照您的名称进行更改。

使用软件包管理器控制台中的命令

Scaffold-DbContext "Server=SERVER_NAME; Database=DATABASE_NAME; User Id=USER_ID; Password=PASWWORD;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -context "BloggingContext" -Force

一个对话框将打开。选择适当的选项。

我选择了"Yes to All"

并从BloggingContext.cs文件中删除OnConfiguring()。


0

我通常会保留一个小文本文件来构建这个脚手架命令,将每个表都添加到其中。

每次执行它时,所有模型都会被覆盖。

如果您在这些模型中编写了脚手架之后的逻辑,除了模型中的字段之外,我建议编写一个包装类,该类从此模型继承并实现了附加方法。这样,您的逻辑就不会被覆盖,只要模型名称保持不变,模型包装器就会继续从中继承。

我对脚手架还比较新,希望2022年会有更好的方法!?


0
多年过去了,但至今为止,脚手架仍不支持在新表/视图上创建类并仅更新dbcontext。我的解决方法是将现有的类复制到另一个目录中,然后删除模型目录中的所有类,在没有构建的情况下运行脚手架,并将复制的类(除了dbcontext)复制回模型目录。
虽然这很繁琐,但至少完成了工作。
也许可以将此功能放在下一个EF版本的愿望清单上。

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