在尝试使用实体框架和迁移创建数据库时遇到麻烦

本文关键字:创建 迁移 数据库 麻烦 遇到 框架 实体 | 更新日期: 2023-09-27 18:08:59

我想通过VS2015的开发人员命令提示符创建数据库EF迁移。当我尝试使用以下命令行:

dotnet ef migrations add v1

我得到这个错误:

属性' partcategory '不能添加到实体类型中'PartCategoryPart',因为它是一个同名的导航属性已经存在于实体类型"PartCategoryPart"上。

DbContext有什么问题吗?我正在尝试在categoryPartsparts之间创建一个多对多表。

public class ShoppingDbContext : IdentityDbContext<User>
{
    public ShoppingDbContext(DbContextOptions options) : base(options)
    {
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
    }
    public DbSet<PartCategory> PartCategories { get; set; }
    public DbSet<Part> Parts { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);            
        modelBuilder.Entity<PartCategoryPart>()
            .HasKey(t => new { t.partCategoriess, t.Part });
        modelBuilder.Entity<PartCategoryPart>()
            .HasOne(pt => pt.partCategoriess)
            .WithMany(p => p.PartCategoryPart)
            .HasForeignKey(pt => pt.PartCategoryId);
        modelBuilder.Entity<PartCategoryPart>()
            .HasOne(pt => pt.Part)
            .WithMany(t => t.PartCategoryPart)
            .HasForeignKey(pt => pt.PartId);
    }
}
public class PartCategoryPart
{
    public int Id { get; set; }
    public int PartCategoryId { get; set; }
    public PartCategory partCategoriess { get; set; }
    public int PartId { get; set; }
    public Part Part { get; set; }        
}
public class PartCategory
{
    public int PartCategoryId { get; set; }
    public string Category { get; set; }
    public List<ProductPartCategory> ProductPartCategories { get; set; }
    public List<PartCategoryPart> PartCategoryPart { get; set; }
}
public class Part 
{
    public int PartId { get; set; }
    public string Code { get; set; }       
    public string Name { get; set; }
    public double? Price { get; set; }
    public List<PartCategoryPart> PartCategoryPart { get; set; }
}

在尝试使用实体框架和迁移创建数据库时遇到麻烦

这里的问题是如何为PartCategoryPart中间实体定义主键。你正在使用导航属性来定义PK你必须像这样使用fk:

modelBuilder.Entity()。HasKey(t => new {t. partcategoryid, t. partd});

参考我自己的作业,下面是如何正确创建实体的方法。您没有定义键。

modelBuilder.Entity<Price>()
            .HasKey(input => input.PriceId)
            .HasName("PrimaryKey_Price_PriceId");
        // Provide the properties of the PriceId column
        modelBuilder.Entity<Price>()
            .Property(input => input.PriceId)
            .HasColumnName("PriceId")
            .HasColumnType("int")
            .UseSqlServerIdentityColumn()
            .ValueGeneratedOnAdd()
            .IsRequired();
        //modelBuilder.Entity<Price>()
        //    .Property(input => input.MetricId)
        //    .HasColumnName("MetricId")
        //    .HasColumnType("int")
        //    .IsRequired();
        modelBuilder.Entity<Price>()
            .Property(input => input.Value)
            .HasColumnName("Value")
            .HasColumnType("DECIMAL(19,4)")
            .IsRequired();
        modelBuilder.Entity<Price>()
            .Property(input => input.RRP)
            .HasColumnName("RRP")
            .HasColumnType("DECIMAL(19,4)")
            .IsRequired(false);
        modelBuilder.Entity<Price>()
            .Property(input => input.CreatedAt)
            .HasDefaultValueSql("GetDate()");
        modelBuilder.Entity<Price>()
            .Property(input => input.DeletedAt)
            .IsRequired(false);
        // Two sets of Many to One relationship between User and ApplicationUser  entity (Start)
        modelBuilder.Entity<Price>()
         .HasOne(userClass => userClass.CreatedBy)
         .WithMany()
         .HasForeignKey(userClass => userClass.CreatedById)
         .OnDelete(DeleteBehavior.Restrict)
         .IsRequired();
        modelBuilder.Entity<Price>()
            .HasOne(userClass => userClass.DeletedBy)
            .WithMany()
            .HasForeignKey(userClass => userClass.DeletedById)
            .OnDelete(DeleteBehavior.Restrict);

请注意,在确定哪个是键之后,您仍然需要在声明任何关系之前声明它的属性。

    modelBuilder.Entity<Price>()
            .HasKey(input => input.PriceId)
            .HasName("PrimaryKey_Price_PriceId");
        // Provide the properties of the PriceId column
        modelBuilder.Entity<Price>()
            .Property(input => input.PriceId)
            .HasColumnName("PriceId")
            .HasColumnType("int")
            .UseSqlServerIdentityColumn()
            .ValueGeneratedOnAdd()
            .IsRequired();