JCa*_*afe 46 c# sql asp.net entity-framework entity-framework-core
我试图首先使用Entity Framework代码来处理一个简单的数据库项目,然后遇到一个我根本想不通的问题.
我注意到EF正在为我的表设置ID,每次自动增加1,完全忽略我为该字段手动输入的值.经过一些搜索,我的理解是,正确的方法是禁用此行为:
modelBuilder.Entity<Event>().Property(e => e.EventID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Run Code Online (Sandbox Code Playgroud)
但是现在我只是得到了这个错误,我不明白为什么:
未处理的异常:System.Data.Entity.Infrastructure.DbUpdateException:更新条目时发生错误.有关详细信息,请参阅内部异常 ---
System.Data.UpdateException:更新条目时发生错误.有关详细信息,请参阅内部异常 ---> System.Data.SqlClient.SqlException:当IDENTITY_INSERT设置为OFF时,无法在表'Events'中为identity列插入显式值.
如果它有用,这是有问题的POCO类:
public class Event
{
[Key, Required]
public int EventID { get; set; }
public string EventType { get; set; } //TODO: Event Type Table later on
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public virtual ICollection<Match> Matches { get; set; }
public virtual ICollection<EventParticipation> EventParticipation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
mar*_*sze 70
因为我更喜欢属性,所以为了完整起见,这里是替代方案:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
Run Code Online (Sandbox Code Playgroud)
注意:这也适用于EF Core.
Col*_*lin 39
默认情况下,Entity Framework假定整数主键是数据库生成的(相当于添加属性HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)或Property(e => e.EventID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);在Fluent API中调用.
如果查看创建表的迁移,您应该看到:
CreateTable(
"dbo.Events",
c => new
{
EventID = c.Int(nullable: false, identity: true),
//etc
})
.PrimaryKey(t => t.EventID );
Run Code Online (Sandbox Code Playgroud)
然后使用Fluent API将模型更改为DatabaseGenerated.None.EF将此放入迁移中:
AlterColumn("dbo.Events", "EventID", c => c.Int(nullable: false, identity: false))
Run Code Online (Sandbox Code Playgroud)
而生成的sql是这样的:
ALTER TABLE [dbo].[Events] ALTER COLUMN [EventID] [int] NOT NULL
这实际上确实蹲了下来.从列中删除IDENTITY并非易事.您需要删除并重新创建表或创建新列,然后您必须复制数据并修复外键.因此,EF并没有为您做到这一点并不奇怪.
你需要弄清楚如何最好地为自己做这件事.你可以从头开始,现在回滚迁移至0并重新脚手架已指定DatabaseGeneratedOption.None,或者你可以手动更改迁移删除并重新创建该表.
或者您可以删除并重新创建列:
DropColumn("Customer", "CustomerId");
AddColumn("Customer", "CustomerId", c => c.Long(nullable: false, identity: false));
Run Code Online (Sandbox Code Playgroud)
编辑 或您可以使用自定义迁移操作打开/关闭身份
| 归档时间: |
|
| 查看次数: |
40188 次 |
| 最近记录: |