c# - 代码优先自动生成的值未创建相应的数据库逻辑
问题描述
我尝试了这两个属性:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreatedDate { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime LastUpdated { get; set; }
和流畅的 API:
modelBuilder.Entity<Customer>().Property(b => b.CreatedDate).HasDefaultValue().ValueGeneratedOnAdd();
modelBuilder.Entity<Customer>().Property(b => b.LastUpdated).HasDefaultValue().ValueGeneratedOnAddOrUpdate();
modelBuilder.Entity<Customer>().Property(b => b.Id).HasDefaultValue().ValueGeneratedOnAdd();
迁移和更新之后,数据库中什么也没有发生——我希望这里有一个触发器或约束。
通读文档,它说:
数据库提供程序可能会自动为某些属性类型设置值生成,但其他可能需要您手动设置值的生成方式。例如,使用 SQL Server 时,将为 GUID 属性自动生成值(使用 SQL Server 顺序 GUID 算法)。但是,如果您指定在添加时生成 DateTime 属性,那么您必须设置一种生成值的方式。一种方法是配置 GETDATE() 的默认值,请参阅默认值。
好的,但是我如何才能使用代码优先在数据库上创建适当的逻辑。我不想在我的模型中创建默认值,因为那样我将依赖于通过我的 API。我以为 DatabaseGeneratedOption 会做点什么……现在它似乎没什么用。
我看到一些帖子在 Up() 方法中创建了一个触发器,但我并不认为迁移文件夹是放置配置代码的好地方。
解决方案
我希望这里有一个触发器或约束。
这不是该配置的作用,它指示 EF 在保存实体时重新加载生成或更新的值。
要实现您想要的,如该部分所述,请参阅默认值:
您可以使用 Fluent API 指定属性的默认值。
class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.Rating) .HasDefaultValue(3); } }
您还可以指定用于计算默认值的 SQL 片段。
class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.Created) .HasDefaultValueSql("getdate()"); } }
推荐阅读
- json - 在 Pyspark 中使用唯一键解析 JSON
- javascript - 如何使用 jquery 将 angularjs 升级到 angular 9?
- react-native - 反应原生。节列表。如何限制项目并通过按钮单击全部显示?
- firebase - Xamarin.Forms 上的 Firebase 身份验证
- clickhouse - 在 Clickhouse 中控制字符串转义?
- python - BigQuery 架构更新而不丢失流缓冲区?
- process - Electron 是否有杀死无用渲染器进程的标准方法?
- .net-core - Razor Pages .Net Core:从 OnPost 打开一个新选项卡/窗口
- c# - 掌握 Excel 电子表格保存其他 Microsoft Docs
- python - 带有更高 Python 版本的更高版本 Mac OS 上的 Mac OS 10.4 应用程序