我们有一个5GB的表(接近5亿行),我们想删除其中一个列上的标识属性,但是当我们尝试通过SSMS执行此操作时 - 它会超时.
这可以通过T-SQL完成吗?
我使用迁移(EF 5.0)和代码优先有一个有趣的效果:
我用GUID主键创建了一些模型.(顺便说一句:对我来说,SQL Server使用它很重要NEWSEQUENTIALID(),这似乎是当前版本中的默认值)
在某些时候,我激活了迁移.我在初始迁移中添加了一些代码,这主要是.Index()根据需要.
当我删除数据库并调用update-database时,出现以下错误:
无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移.将挂起的模型更改写入基于代码的迁移或启用自动迁移.将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移.您可以使用Add-Migration命令将挂起的模型更改写入基于代码的迁移.
我尝试过AutomaticMigrationsEnabled = true,无需更改或添加任何内容即可使用!
但既然我不想要AutomaticMigrationsEnabled,我也尝试再次删除数据库,update-database然后调用add-migration.我最终得到了一个似乎没有改变任何东西的额外迁移(见下文).我也尝试将这些行添加到初始迁移的底部 - 但这并没有改变任何东西.
其中一个型号:
[Table(Speaker.TABLENAME)]
public class Speaker : BaseModel
{
public const String TABLENAME = "Speaker";
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
[MaxLength(50, ErrorMessage = "Name must be 50 characters or less")]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
初始迁移代码:
public partial class InitialCreate : DbMigration
{
public override void Up()
{ …Run Code Online (Sandbox Code Playgroud) 码:
migrationBuilder.AddPrimaryKey("AspNetRoles", "PK_AspNetRoles", new[] { "Id" }, isClustered: true);
Run Code Online (Sandbox Code Playgroud)
我收到错误消息为 Cannot define PRIMARY KEY constraint on nullable column in table 'AspNetRoles'.
MigrationBuilder的命名空间 - Microsoft.Data.Entity.Relational.Migrations.Builders
如何NOT NULL在ASP.NET MVC 6中分配上面的代码
我通过实体框架代码优先创建了一个表,主键设置为自动递增,但现在我想从列中删除该自动递增。我已经尝试使用流畅的 API 做到这一点:
public class ProductTypeMap: EntityTypeConfiguration<ProductType>
{
public ProductTypeMap()
{
// This is an enum effectively, so we need fixed IDs
Property(x => x.ProductTypeId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个注释:
public class ProductType
{
[Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ProductTypeId { get; set; }
public string ProductTypeName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,它们都生成相同的迁移代码:
public partial class removeproducttypeidentity : DbMigration
{
public override void Up()
{
DropPrimaryKey("dbo.ProductTypes");
AlterColumn("dbo.ProductTypes", "ProductTypeId", c => c.Int(nullable: false));
AddPrimaryKey("dbo.ProductTypes", "ProductTypeId");
}
public override void Down()
{
DropPrimaryKey("dbo.ProductTypes"); …Run Code Online (Sandbox Code Playgroud) 我需要在数据库中手动输入主键值,因为我需要键值与枚举同步。但是,使用 DatabaseGeneeratedoption.None 似乎不起作用。即使我删除数据库并重新开始,JobType 中的 Id 列仍然具有自动递增的主键。
这与我使用枚举作为主键有关吗?
工作实体
public class Job : EntityBase
{
public long JobId { get; set; }
public JobTypeEnum JobTypeId { get; set; }
public JobType JobType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
工作类型
public class JobType
{
public JobTypeEnum Id { get; set; }
public String Name { get; set; }
public String Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
配置类
public class JobTypeConfiguration : EntityTypeConfiguration<JobType>
{
public JobTypeConfiguration()
{
HasKey(x => x.Id);
Property(x => x.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); …Run Code Online (Sandbox Code Playgroud) 我根据这篇文章创建了代码优先的应用程序 - Code First to a New Database.现在我要更改DatabaseGeneratedOption Blog.BlogId.我以下一种方式更改了我的代码:
public class Blog
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int BlogId
{
get;set;
}
...
}
Run Code Online (Sandbox Code Playgroud)
并为此代码更新创建了迁移:
public override void Up()
{
DropForeignKey("dbo.Posts", "BlogId", "dbo.Blogs");
DropPrimaryKey("dbo.Blogs");
AlterColumn("dbo.Blogs", "BlogId", c => c.Int(nullable: false, identity: false));
AddPrimaryKey("dbo.Blogs", "BlogId");
AddForeignKey("dbo.Posts", "BlogId", "dbo.Blogs", "BlogId", cascadeDelete: true);
}
Run Code Online (Sandbox Code Playgroud)
根据这个我更改了在Main函数中创建博客实体的代码(在BlogId那里添加.)
var blog = new Blog
{
Name = name,
BlogId = 110//it could be any other value that isn't represented in column
};
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试运行我的代码时,我得到下一个异常:带有下一条消息的DbUpdateException …
我正在使用EF 6.1.3代码优先,但由于数据库已经存在,所以无法进行迁移。我有一个SRReports具有以下属性的实体:
[Key, Required]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
public int FRID { get; set; }
Run Code Online (Sandbox Code Playgroud)
DatabaseGeneratedOption.None假设FRID是自动生成的,实体框架将忽略,并将TSQL发送到服务器。为实体分配了FRID的值,但是实体框架忽略该值,并假定该值是自动生成的。(这是通过检查发送到服务器的TRACE确认的)。异常消息是:
Message =无法将值NULL插入表'RevLogon.dbo.SCIREPORTS'的列'FRID'中;列不允许为空。INSERT失败。该语句已终止。
我尝试使用流利的API来代替注释(并在注释之外)。
modelBuilder.Entity<SCIREPORTS>()
.HasKey(e => e.FRID);
modelBuilder.Entity<SCIREPORTS>()
.Property(e => e.FRID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Run Code Online (Sandbox Code Playgroud)
但是当我查询表时出现错误:
SCIREPORTS sr = mydb.SCIREPORTS.Where(s => s.FRID == FRID ).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
捕获到System.MissingMethodException HResult = -2146233069消息=未找到方法:“ System.Data.Entity.ModelConfiguration.Configuration.PrimitivePropertyConfiguration System.Data.Entity.ModelConfiguration.Configuration.PrimitivePropertyConfiguration.HasDatabaseGeneratedOption(System.Nullable`1)”。*
我已卸载并重新安装了EF软件包,但无法解决此问题。如何获得EF插入带有ID的记录?
这是插入记录的基本代码:
public SRUserComp(string myemail, short mycounter, int myFRID, string myreptype, string mypassword)
{ email = myemail;
Counter = mycounter;
reptype = myreptype;
password = mypassword;
FRID = myFRID; }
public bool CreateSRRecord(DateTime repduedate,
short repnumber) …Run Code Online (Sandbox Code Playgroud) 使用实体框架SQL-Server-CE我创建了一个这样的表:
class Era {
public long Id { get; set; }
[Index(IsUnique=true), Required]
public long Code { get; set; }
public string Name { get; set; }
public long StartDate { get; set; }
public long EndDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
每当我尝试使用Entity Framework插入其中时,将忽略Id该Era对象的字段并Id插入自动递增.
如何使Id字段不使用自动递增的值,而是使用给定的值,最好使用注释.
我需要将一个实体插入数据库,该实体对其 id 有约束,因此我想手动设置它。
注意:下面的模型是了解我正在做的事情的最小示例。整个过程在 ASP.NET Core 2 上运行,并带有 EF Core 和 Pomelo MySql 提供程序。
我正在尝试在现有数据库(MySQL)中创建一个实体,其定义如下:
CREATE TABLE Users (
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(128) NOT NULL);
CREATE TABLE UserData (
id INTEGER PRIMARY KEY,
name VARCHAR(32) NOT NULL,
FOREIGN KEY(id) REFERENCES Users(id));
Run Code Online (Sandbox Code Playgroud)
所以Users表中的每条记录在表中都有一条记录UserData。现在在我的代码中我想使用类似的东西
Context.Users.Add(user);
Context.SaveChanges();
data.Id = user.Id;
Context.UserData.Add(data);
Context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
它们User应该Id由数据库生成,然后UserData用它创建Id。然而,EF执行的语句会导致错误:
Failed executing DbCommand (6ms) [Parameters=[@p0='?', @p1='?' (Size = 32)], CommandType='Text', CommandTimeout='30']
INSERT INTO …Run Code Online (Sandbox Code Playgroud)