EF Core关系不存在。

9

我希望在PostgreSQL中创建一个数据库和API,已经在EF Core 1.0.0中创建了模型和API。模型存在于独立的库中。

public class Architect : IEntity
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }
    public string Email { get; set; }
    public ICollection<Project> Projects { get; set; }
}

public class Project : IEntity
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    [JsonConverter(typeof(IsoDateTimeConverter))]
    public DateTimeOffset CreatedAt { get; set; }
    public ICollection<Company> Companies { get; set; }
    public string City { get; set; }
    public ICollection<ProjectState> ProjectStates { get; set; }
    public Guid ArchitectId { get; set; }
    public Architect Architect { get; set; }
}

public class Company : IEntity
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public Guid ProjectId { get; set; }
    public Project Project { get; set; }
}

 public class ProjectState : IEntity
{
    public Guid Id { get; set; }
    public ProjectPhase phase { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public Guid ProjectId { get; set; }
    public Project Project { get; set; }
}

我创建了一个继承自DbContext的DemoContext。我在OnModelCreating(ModelBuilder modelBuilder)方法中定义了关系。

public class DemoContext : DbContext
{
    public DbSet<Architect> Architects { get; set; }
    public DbSet<Project> Projects { get; set; }
    public DbSet<Company> Companies { get; set; }
    public DbSet<ProjectState> ProjectStates { get; set; }

    public DemoContext(DbContextOptions<DemoContext> options) : base(options) { }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql("PORT = 5432; HOST = localhost; TIMEOUT = 15; POOLING = True; MINPOOLSIZE = 1; MAXPOOLSIZE = 20; COMMANDTIMEOUT = 20; DATABASE = ProgressTest; PASSWORD = 'postgres'; USER ID = postgres", b => b.MigrationsAssembly("WebAPI.API"));
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasPostgresExtension("uuid-ossp");

        modelBuilder.Entity<Project>()
            .HasOne(p => p.Architect)
            .WithMany(a => a.Projects)
            .HasForeignKey(p=>p.ArchitectId);

        modelBuilder.Entity<ProjectState>()
            .HasOne(p => p.Project)
            .WithMany(p => p.ProjectStates)
            .HasForeignKey(p => p.ProjectId);

        modelBuilder.Entity<Company>()
            .HasOne(c => c.Project)
            .WithMany(p => p.Companies)
            .HasForeignKey(c => c.ProjectId);
    }
}

我希望迁移所有类并创建新的数据库。我使用dotnet ef migrations add InitializeMigration添加了新的迁移,然后我想更新我的数据库,所以我使用dotnet ef database update,但是Postgres抛出了异常:

Npgsql.PostgresException: 42P01: relationship "ProjectState.IX_ProjectState_ProjectId" doesn't exist

你能帮我翻译这个吗?


1
在对 Sqlite 进行代码测试时,不会出现这种情况。尝试再次添加迁移,并使用 -script 选项查看生成的 DDL 的情况。然后直接执行它以针对数据库。 - Mike Brind
我不知道发生了什么事情,但在从我的迁移生成脚本后,我使用了 database update,数据库已经成功创建。谢谢你的帮助! - Marcin Gurbiel
1个回答

3

在我的情况下,我只需使用“Table”属性来装饰我的模型类,并使用实际的表名(注意大小写敏感性),就解决了我的问题。

[Table("city")]
public class CityModel

同样的经历,感谢您的发布! - Lereveme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接