【问题标题】:"Column names in each table must be unique." during database update“每个表中的列名必须是唯一的。”在数据库更新期间
【发布时间】:2017-04-03 19:36:38
【问题描述】:

我对 ASP.NET 完全陌生,但这是我第一个使用 ASP.NET Core 的应用程序。创建迁移后更新数据库有问题。当我输入命令:dotnet ef database update 时,出现错误:

每个表中的列名必须是唯一的。列名“PortalUserId” 在表“广告”中指定了多次。

我认为问题出在我的模型结构上,但我不知道我做错了什么。当我使用 ASP.NET MVC 5 进行开发时,一切正常。

这是我的模型(案例实体不需要):

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    public DbSet<PortalUser> PortalUsers { get; set; }
    public DbSet<Advert> Adverts { get; set; }
    public DbSet<Category> Categories { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);
    }
}

public class Advert
{
    public int ID { get; set; }
    public string Title { get; set; }
    public int CategoryID { get; set; }
    public virtual Category Category { get; set; }
    public int PortalUserID { get; set; }
    public PortalUser PortalUser { get; set; }
}

public class PortalUser : IdentityUser
{
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public ICollection<Advert> Adverts { get; set; }

}

我在这里做的是用于延迟加载的普通虚拟映射。我在 Advert 字段中将 FK 存储到 PortalUser。

我会感谢每一个有用的答案!

我已经发现,不支持延迟加载,所以现在我的模型看起来像官方教程中的样子:

https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/new-db

    public class BloggingContext : DbContext
{
    public BloggingContext(DbContextOptions<BloggingContext> options)
        : base(options)
    { }

    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 BlogId { get; set; }
    public Blog Blog { get; set; }
}

【问题讨论】:

  • 今后请避免在标题中强制添加标签,除非它是问题/句子的自然部分,请参阅帮助中心:stackoverflow.com/help/tagging
  • 您的大小写似乎不一致。您是否尝试将属性命名为 PortalUserId 而不是 PortalUserID (注意最后的小写 D?EF Core 默认情况下会尝试将 Id 添加到外键(如果未定义),并且 db 列没有t 区分大小写。您的错误消息显示PortalUserId,但您的模型有PortalUserID
  • 我将其更改为 PortalUserId - 已完成对数据库的更新,但是在数据库结构中,我现在拥有 PortalUserId 和 PortalUserId1。所以它似乎复制了它。我不知道为什么会这样。在 MVC 中不会发生这样的事情。
  • 您的OnModelCreating 中还有其他内容吗?还要查看您的迁移文件,看看之前发生了什么。如果您仍处于早期开发阶段,您还可以删除数据库 + 迁移文件并创建一个新的初始迁移,或者如果您需要更多工作,请回滚到第一次创建 PortalUserId 之前的点
  • OnModelCreating 中没有更多内容。我一直在创建新数据库。然而,我想出了解决方案,这对我来说很奇怪。我刚刚删除了 FK: PortaluserID 并只留下了 PortalUser PortalUser 属性 - 然后它被映射到数据库中的 PortalUserId 字段。然后只有我不明白为什么我上面提到的博客和帖子的例子翻了一番......

标签: c# entity-framework ef-code-first asp.net-core entity-framework-core


【解决方案1】:

好的,伙计们,我找到了解决方案!所需要的就是将属性 PortalUserId 的类型从 int 更改为 string。比一切都编译并且没有出现双重字段!

感谢您至少尝试帮助我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多