Entity Framework 核心中的冗余参考列
Redundant Reference Column in Entity Framework Core
场景是:
- 有多个用户
- 有多张图片
每张图片可以属于多个用户,每个用户可以拥有多张图片。
对于多对多关系,我创建了一个单独的 class 并使用了 FluentAPI。
class如下:
用户
public class AppUser : IdentityUser
{
public IEnumerable<UsersImages> UsersImages { get; set; }
}
图片
public class Image
{
public int Id { get; set; }
public string ImageUrl { get; set; }
public IEnumerable<UsersImages> UsersImages { get; set; }
}
用户图片
public class UsersImages
{
public string UserId { get; set; }
public int ImageId { get; set; }
public AppUser TheUser { get; set; }
public Image TheImage { get; set; }
}
整个AppDbContext代码
public class SiteDbContext : IdentityDbContext<AppUser>
{
public SiteDbContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<UsersImages>()
.HasKey(us => new { us.UserId, us.ImageId });
modelBuilder.Entity<UsersImages>()
.HasOne(us => us.TheUser)
.WithMany(u => u.UsersImages)
.HasForeignKey(us => us.UserId);
modelBuilder.Entity<UsersImages>()
.HasOne(us => us.TheImage)
.WithMany(s => s.UsersImages)
.HasForeignKey(us => us.ImageId);
}
}
现在的问题是
通过创建迁移,我得到以下代码:
migrationBuilder.CreateTable(
name: "Image",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
ImageUrl = table.Column<string>(type: "TEXT", nullable: true),
AppUserId = table.Column<string>(type: "TEXT", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Image", x => x.Id);
table.ForeignKey(
name: "FK_Image_AspNetUsers_AppUserId",
column: x => x.AppUserId,
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
为什么会有 AppUserId 列? (我不要)
谢谢大家
解决方案
我的问题是因为分心了。
@Ivan.Stoev 是对的。
在应用迁移时,AppUser class 继承自抽象 class,其中包含:
public IEnumerable<Image> Images { get; set; }
谢谢你们的回答,对于我犯下的巨大错误,我深表歉意。
场景是:
- 有多个用户
- 有多张图片
每张图片可以属于多个用户,每个用户可以拥有多张图片。
对于多对多关系,我创建了一个单独的 class 并使用了 FluentAPI。
class如下:
用户
public class AppUser : IdentityUser
{
public IEnumerable<UsersImages> UsersImages { get; set; }
}
图片
public class Image
{
public int Id { get; set; }
public string ImageUrl { get; set; }
public IEnumerable<UsersImages> UsersImages { get; set; }
}
用户图片
public class UsersImages
{
public string UserId { get; set; }
public int ImageId { get; set; }
public AppUser TheUser { get; set; }
public Image TheImage { get; set; }
}
整个AppDbContext代码
public class SiteDbContext : IdentityDbContext<AppUser>
{
public SiteDbContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<UsersImages>()
.HasKey(us => new { us.UserId, us.ImageId });
modelBuilder.Entity<UsersImages>()
.HasOne(us => us.TheUser)
.WithMany(u => u.UsersImages)
.HasForeignKey(us => us.UserId);
modelBuilder.Entity<UsersImages>()
.HasOne(us => us.TheImage)
.WithMany(s => s.UsersImages)
.HasForeignKey(us => us.ImageId);
}
}
现在的问题是
通过创建迁移,我得到以下代码:
migrationBuilder.CreateTable(
name: "Image",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
ImageUrl = table.Column<string>(type: "TEXT", nullable: true),
AppUserId = table.Column<string>(type: "TEXT", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Image", x => x.Id);
table.ForeignKey(
name: "FK_Image_AspNetUsers_AppUserId",
column: x => x.AppUserId,
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
为什么会有 AppUserId 列? (我不要)
谢谢大家
解决方案
我的问题是因为分心了。
@Ivan.Stoev 是对的。
在应用迁移时,AppUser class 继承自抽象 class,其中包含:
public IEnumerable<Image> Images { get; set; }
谢谢你们的回答,对于我犯下的巨大错误,我深表歉意。