c# - ASP.NET MVC5 - 更新数据库后创建不需要的字段

标签 c# asp.net-mvc entity-framework

我正在尝试在“ApplicationUser”类和最近创建的名为“Issue”的类之间创建“一对多”关系。

所以,在 Models/IdentityModels.cs/ApplicationUser 中,我添加了这个属性:

public ICollection<Issue> Issues { get; set; }

Issue.cs 有这段代码:

namespace Test.Models
{
    public class Issue
    {
        public int Id { get; set; }
        public ApplicationUser Courier { get; set; }
        public ApplicationUser Customer { get; set; }
    }
}

我正在使用自动迁移。因此,在构建并运行“update-database”之后,Issues 表 是用这些字段创建的:

  1. 身份证
  2. ApplicationUser_Id
  3. express 编号
  4. 客户编号

我的问题是为什么要创建“ApplicationUser_Id”字段,我该如何阻止它?

最佳答案

问题是 EF 认为您实际上想要 Issue 和 ApplicationUser 之间的三个一对多关系:

  • 一个代表ICollection<Issue> IssuesApplicationUser (ApplicationUser_Id)
  • 一个代表ApplicationUser CourierIssue (CourierId)
  • 一个代表ApplicationUser CustomerIssue (客户编号)

(请注意,EF 允许从任一侧定义关系。)

如果你想要ApplicationUser.Issues包含此用户的所有问题,无论他是 express 员还是客户,您都需要额外的 ApplicationUser_Id key 。配置 EF 使其工作将非常痛苦。

也许有一个更简单的解决方案:在 ApplicationUser 上引入两个集合.

public ICollection<Issue> CourierIssues { get; set; }
public ICollection<Issue> CustomerIssues { get; set; }

然后使用流畅的 API 在 ModelBuilder 中配置反向链接以消除 ApplicationUser_Id 键:

 modelBuilder.Entity<ApplicationUser>().HasMany(au => au.CourierIssues).WithOptional(i => i.Courier);
 modelBuilder.Entity<ApplicationUser>().HasMany(au => au.CustomerIssues).WithOptional(i => i.Customer);

关于c# - ASP.NET MVC5 - 更新数据库后创建不需要的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39961494/

相关文章:

asp.net-mvc - 如何使用 .net Framework4.0 在 MVC4 中获取当前 Windows 用户登录名

c# - Code First - 外键引用在分配 Id 时未加载

c# - 将数百万行插入 SQL Server 数据库的最佳方法

visual-studio - 如何在运行时获取正确的数据库实体?

c# - Protobuf-net.Grpc服务合约继承

c# - WPF 隐藏滑轨

ASP.NET - ActionResult 参数在传递字符串时总是返回 null - 为什么?

c# - 如何创建自己的表单设计器?

c# - 修复 Windows 窗体中的拆分容器控件

asp.net-mvc - SignalR:无法连接到本地或任何其他 IP 地址