【发布时间】: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