如何在 EF Core 2.0 中使用 IEntityTypeConfiguration 设置 ForeignKey 和 Index 属性
How to set ForeignKey and Index properties using IEntityTypeConfiguration in EF Core 2.0
我正在尝试使用 EF Core 2.0 中新增的 EntityConfiguration 接口。
附录 可能有助于查看消息 class
public class Message
{
public int MessageId { get; set; }
[Required]
public string MessageForUserId { get; set; }
public virtual ApplicationUser MessageForUser { get; set; }
[Required]
public string MessageFromUserId { get; set; }
public virtual ApplicationUser MessageFromUser { get; set; }
[Required]
public string MessageContent { get; set; }
public bool MessageRead { get; set; }
[Required]
public DateTime MessageCreatedOn { get; set; }
public DateTime? MessageReadOn { get; set; }
}
和 AppUser class
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
public Gender Gender { get; set; }
public SubscriptionLevel SubscriptionLevel { get; set; }
public NotificationType NotificationType { get; set; }
public string AvatarUrl { get; set; }
public ICollection<Message> UserMessages { get; set; }
public ICollection<Message> SentMessages { get; set; }
public ICollection<IdentityUserClaim<string>> Claims { get; set; }
}
下面是实体在我的 OnModelCreating
方法中的定义方式。
builder.Entity<Message>()
.HasOne(x => x.MessageForUser)
.WithMany(x => x.UserMessages)
.HasForeignKey(x => x.MessageForUserId)
.OnDelete(DeleteBehavior.Restrict);
builder.Entity<Message>()
.HasOne(x => x.MessageFromUser)
.WithMany(x => x.SentMessages)
.HasForeignKey(x => x.MessageFromUserId)
.OnDelete(DeleteBehavior.Cascade);
我的 IEntityTypeConfiguration
public class AppUserConfig : IEntityTypeConfiguration<ApplicationUser>
{
public void Configure(EntityTypeBuilder<ApplicationUser> builder)
{
builder.Property(u => u.FirstName).HasMaxLength(31);
builder.Property(u => u.FirstName).IsRequired();
builder.Property(u => u.LastName).HasMaxLength(55);
builder.Property(u => u.LastName).IsRequired();
builder.Property(u => u.DateOfBirth).HasColumnType("datetime");
builder.Property(u => u.DateOfBirth).IsRequired();
builder.Property(u => u.Gender).IsRequired();
}
}
EF 6 方法有一个 HasForeignKey
构建器方法,该方法不再可用,我似乎找不到任何方法来添加它们。
以下是迁移如何从我的 OnModelCreating
方法构建 table。我想将这些项目中的大部分放入我的配置 class.
migrationBuilder.CreateIndex(
name: "IX_Messages_MessageForUserId",
schema: "AppContext",
table: "Messages",
column: "MessageForUserId");
migrationBuilder.CreateIndex(
name: "IX_Messages_MessageFromUserId",
schema: "AppContext",
table: "Messages",
column: "MessageFromUserId");
migrationBuilder.AddForeignKey(
name: "FK_Messages_AspNetUsers_MessageForUserId",
schema: "AppContext",
table: "Messages",
column: "MessageForUserId",
principalSchema: "AppContext",
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
migrationBuilder.AddForeignKey(
name: "FK_Messages_AspNetUsers_MessageFromUserId",
schema: "AppContext",
table: "Messages",
column: "MessageFromUserId",
principalSchema: "AppContext",
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
仍然有一个 HasIndex
方法,但我不确定如何在 HasIndex
.
的 lambda 表达式中复制迁移产生的内容
HasForeignKey()
在 EF Core 中仍然可用,就像您在 EF6 中一样。误解是,它在 EntityTypeBuilder<T>
上不可用,但在 ReferenceNavigationBuilder<T,K>
上可用,这是来自 WithMany()
.
的 return 类型
public class PostConfiguration : IEntityTypeConfiguration<Post>
{
public void Configure(EntityTypeBuilder<Post> builder)
{
builder.HasOne(y => y.Blog)
.WithMany(x => x.Posts)
.HasForeignKey(x => x.BlogForeignKey);
}
}
public class ApplicationContext :DbContext
{
public ApplicationContext(DbContextOptions<ApplicationContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.ApplyConfiguration(new PostConfiguration());
}
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogForeignKey { get; set; }
public Blog Blog { get; set; }
}
我正在尝试使用 EF Core 2.0 中新增的 EntityConfiguration 接口。
附录 可能有助于查看消息 class
public class Message
{
public int MessageId { get; set; }
[Required]
public string MessageForUserId { get; set; }
public virtual ApplicationUser MessageForUser { get; set; }
[Required]
public string MessageFromUserId { get; set; }
public virtual ApplicationUser MessageFromUser { get; set; }
[Required]
public string MessageContent { get; set; }
public bool MessageRead { get; set; }
[Required]
public DateTime MessageCreatedOn { get; set; }
public DateTime? MessageReadOn { get; set; }
}
和 AppUser class
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
public Gender Gender { get; set; }
public SubscriptionLevel SubscriptionLevel { get; set; }
public NotificationType NotificationType { get; set; }
public string AvatarUrl { get; set; }
public ICollection<Message> UserMessages { get; set; }
public ICollection<Message> SentMessages { get; set; }
public ICollection<IdentityUserClaim<string>> Claims { get; set; }
}
下面是实体在我的 OnModelCreating
方法中的定义方式。
builder.Entity<Message>()
.HasOne(x => x.MessageForUser)
.WithMany(x => x.UserMessages)
.HasForeignKey(x => x.MessageForUserId)
.OnDelete(DeleteBehavior.Restrict);
builder.Entity<Message>()
.HasOne(x => x.MessageFromUser)
.WithMany(x => x.SentMessages)
.HasForeignKey(x => x.MessageFromUserId)
.OnDelete(DeleteBehavior.Cascade);
我的 IEntityTypeConfiguration
public class AppUserConfig : IEntityTypeConfiguration<ApplicationUser>
{
public void Configure(EntityTypeBuilder<ApplicationUser> builder)
{
builder.Property(u => u.FirstName).HasMaxLength(31);
builder.Property(u => u.FirstName).IsRequired();
builder.Property(u => u.LastName).HasMaxLength(55);
builder.Property(u => u.LastName).IsRequired();
builder.Property(u => u.DateOfBirth).HasColumnType("datetime");
builder.Property(u => u.DateOfBirth).IsRequired();
builder.Property(u => u.Gender).IsRequired();
}
}
EF 6 方法有一个 HasForeignKey
构建器方法,该方法不再可用,我似乎找不到任何方法来添加它们。
以下是迁移如何从我的 OnModelCreating
方法构建 table。我想将这些项目中的大部分放入我的配置 class.
migrationBuilder.CreateIndex(
name: "IX_Messages_MessageForUserId",
schema: "AppContext",
table: "Messages",
column: "MessageForUserId");
migrationBuilder.CreateIndex(
name: "IX_Messages_MessageFromUserId",
schema: "AppContext",
table: "Messages",
column: "MessageFromUserId");
migrationBuilder.AddForeignKey(
name: "FK_Messages_AspNetUsers_MessageForUserId",
schema: "AppContext",
table: "Messages",
column: "MessageForUserId",
principalSchema: "AppContext",
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
migrationBuilder.AddForeignKey(
name: "FK_Messages_AspNetUsers_MessageFromUserId",
schema: "AppContext",
table: "Messages",
column: "MessageFromUserId",
principalSchema: "AppContext",
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
仍然有一个 HasIndex
方法,但我不确定如何在 HasIndex
.
HasForeignKey()
在 EF Core 中仍然可用,就像您在 EF6 中一样。误解是,它在 EntityTypeBuilder<T>
上不可用,但在 ReferenceNavigationBuilder<T,K>
上可用,这是来自 WithMany()
.
public class PostConfiguration : IEntityTypeConfiguration<Post>
{
public void Configure(EntityTypeBuilder<Post> builder)
{
builder.HasOne(y => y.Blog)
.WithMany(x => x.Posts)
.HasForeignKey(x => x.BlogForeignKey);
}
}
public class ApplicationContext :DbContext
{
public ApplicationContext(DbContextOptions<ApplicationContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.ApplyConfiguration(new PostConfiguration());
}
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogForeignKey { get; set; }
public Blog Blog { get; set; }
}