请不要将此问题标记为重复的问题,因为我已检查过类似的问题,并且他们的错误消息和版本不相同。 他们中的许多人使用的是3年前的旧版本,所以我认为对于我正在使用的EF的最新版本,应该有一种不同的方式来实现我想要的。谢谢。
我正在尝试使用最新版本的EF 6.1.3创建一个表Event,(我首先使用代码)。
一切顺利,只有身份种子不适用于事件表上的ID属性。
这是我的代码:
public class Event
{
public Event()
{
Organizers = new HashSet<AspNetUser>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string Id { get; set; }
....................
public virtual ICollection<AspNetUser> Hosts {get; set;}
}
在AspNetUser类中,我添加了以下代码行:
public class AspNetUser
{
................
public AspNetUser()
base:("theConnectionString")
{
Events = new HashSet<Event>();
}
public virtual ICollection<Event> Events {get; set;}
................
}
我更新了我的db上下文类中的OnModelCreating()方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<AspNetRole>()
.HasMany(e => e.AspNetUsers)
.WithMany(e => e.AspNetRoles)
.Map(m => m.ToTable("AspNetUserRoles").MapLeftKey("RoleId").MapRightKey("UserId"));
modelBuilder.Entity<AspNetUser>()
.HasMany(e => e.AspNetUserClaims)
.WithRequired(e => e.AspNetUser)
.HasForeignKey(e => e.UserId);
modelBuilder.Entity<AspNetUser>()
.HasMany(e => e.AspNetUserLogins)
.WithRequired(e => e.AspNetUser)
.HasForeignKey(e => e.UserId);
modelBuilder.Entity<Event>()
.HasMany(e => e.Organizers)
.WithMany(e => e.Events)
.Map(e => e.ToTable("AspNetUsers").MapLeftKey("UserId").MapRightKey("EventId"));
modelBuilder.Entity<Event>()
.Property(e => e.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
正如您所看到的,最后两个块是我的代码。
然后我跑了:
添加迁移AddEventTable
更新的数据库的
生成的201504071252445_AddEventTable.cs如下所示:
public partial class AddEventTable : DbMigration
{
public override void Up()
{
RenameTable(name: "dbo.AspNetUsers", newName: "AspNetUsers1");
CreateTable(
"dbo.Events",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
Title = c.String(nullable: false, maxLength: 256),
Venue = c.String(),
StartDateTime = c.DateTime(nullable: false),
EndDateTime = c.DateTime(nullable: false),
Capacity = c.Int(nullable: false),
Content = c.String(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.AspNetUsers",
c => new
{
UserId = c.String(nullable: false, maxLength: 128),
EventId = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => new { t.UserId, t.EventId })
.ForeignKey("dbo.Events", t => t.UserId, cascadeDelete: true)
.ForeignKey("dbo.AspNetUsers1", t => t.EventId, cascadeDelete: true)
.Index(t => t.UserId)
.Index(t => t.EventId);
}
public override void Down()
{
DropForeignKey("dbo.AspNetUsers", "EventId", "dbo.AspNetUsers1");
DropForeignKey("dbo.AspNetUsers", "UserId", "dbo.Events");
DropIndex("dbo.AspNetUsers", new[] { "EventId" });
DropIndex("dbo.AspNetUsers", new[] { "UserId" });
DropTable("dbo.AspNetUsers");
DropTable("dbo.Events");
RenameTable(name: "dbo.AspNetUsers1", newName: "AspNetUsers");
}
}
正如您所看到的,它在Up()中添加了一行不需要的代码:
RenameTable(name: "dbo.AspNetUsers", newName: "AspNetUsers1");
并在Down()
中RenameTable(name: "dbo.AspNetUsers1", newName: "AspNetUsers");
我试图在不为ID提供值的情况下将值插入此表中,但它失败了:
这是sql查询
insert into Events values( 'Title', 'Address', '2015-04-09 20:00:00.000','2015-04-09 20:00:00.000', 30, 'Content!')
以下是错误消息。
列名或提供的值数与表不匹配 定义
所以我的问题是:
谢谢。
答案 0 :(得分:2)
您的部分问题是这一点,特别是Map()
电话:
modelBuilder.Entity<Event>()
.HasMany(e => e.Organizers)
.WithMany(e => e.Events)
.Map(e => e.ToTable("AspNetUsers").MapLeftKey("UserId").MapRightKey("EventId"));
您将Event类和AspNetUsers类之间的连接器映射到“AspNetUsers”表。这就是导致代码将现有表重命名为其他内容的原因。你也有倒映的映射。 MapLeftKey
会引用Event
表。 MapRightKey
会引用AspNetUsers
表。我会把它改成类似的东西(不必要的冗长,我知道,只是为了说明目的)
.Map(e => e.ToTable("AspNetUsersToEventsMapping")
.MapLeftKey("EventId")
.MapRightKey("UserId"))
问题的第二部分是您的Id
字段是string
。我不相信字符串字段可以是DatabaseGeneratedOption.Identity
- 它应该是一个数值。