当前位置: 首页 > 编程语言 > C#

使用EntityFrameworkCore自动添加部分主键共享

时间:2023-04-10 15:03:26 C#

使用EntityFrameworkCore自动添加部分主键我使用EFCorefluentAPI声明了以下模型:modelBuilder.Entity().HasKey(p=>new{p.Name,p.Id});当我在PostgreSQL中创建数据库时,两个字段都标记为主键,但Id字段未标记为自动递增。我还尝试将[Key][DatabaseGenerated(DatabaseGeneratedOption.Identity)]添加到Foo下的Id字段,但它对迁移代码没有任何影响。有没有办法让IdAI虽然是PPK?这些数据注释应该可以解决问题,也许与PostgreSQL提供程序有关。来自EFCore文档:根据所使用的数据库提供程序,值可以由EF或数据库在客户端生成。如果该值是由数据库生成的,EF可以在将实体添加到上下文时分配一个临时值。然后,在SaveChanges期间,这个临时值将被数据库生成的值替换。您也可以尝试使用此FluentApi配置:modelBuilder.Entity().Property(f=>f.Id).ValueGeneratedOnAdd();但正如我之前所说,我认为这与数据库提供者有关。尝试向数据库中添加一个新行,稍后检查是否为Id列生成了一个值。首先,你不应该将FluentApi与数据注释合并,所以我建议你使用以下之一:确保你有键集modelBuilder.Entity().HasKey(p=>new{p.Name,p.Id});modelBuilder.Entity().Property(p=>p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);或者你可以使用数据注释来实现它publicclassFoo{[DatabaseGenerated(DatabaseGeneratedOption.Identity)][Key,Column(Order=0)]publicintId{get;放;}[Key,Column(Order=1)]publicstringName{get;放;对于遇到这个问题的任何人,即使添加了int主键在下面的评论之后仍然使用SQLServer数据库并且仍然抛出异常[Key][DatabaseGenerated(DatabaseGeneratedOption.Identity)]publicintId{get;放;请检查您的SQL,确保您有'IDENTITY(startValue,increment)',CREATETABLE[dbo].[User]([Id]INTIDENTITY(1,1)NOTNULLPRIMARYKEY)这将导致数据库每次添加新行时递增id,从1开始,递增量为1。我不小心遗漏了我的SQL,这让我浪费了一个小时的时间,所以希望这对某人有所帮助!注释属性如下[Key][DatabaseGenerated(DatabaseGeneratedOption.Identity)]publicintID{get;放;要在新模型上使用标识列为所有值生成的属性,只需将以下内容放在上下文的OnModelCreating()中:builder.ForNpgsqlUseIdentityColumns();这将创建所有带有.ValueGeneratedOnAdd()的键,默认情况下其他属性具有Identity。您始终可以使用ForNpgsqlUseIdentityAlwaysColumns()拥有一个身份,您还可以使用UseNpgsqlIdentityColumn()和UseNpgsqlIdentityAlwaysColumn()在逐个属性的基础上指定一个身份。postgresefcorevaluegeneration指定columntype为PostgreSQL的serial来生成id。[Key][DatabaseGenerated(DatabaseGeneratedOption.Identity)][Column(Order=1,TypeName="serial")]publicintID{get;放;}https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL以上是C#学习教程:使用EntityFrameworkCore自动添加一些主键分享所有内容。如果对大家有用,需要进一步了解C#学习教程,还望大家多多关注~本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: