Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC5-更新数据库后创建的不需要的字段_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

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

C# ASP.NET MVC5-更新数据库后创建的不需要的字段,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我试图在“ApplicationUser”类和最近创建的“Issue”类之间创建一个“一对多”关系 因此,在Models/IdentityModels.cs/ApplicationUser中,我添加了以下属性: public ICollection<Issue> Issues { get; set; } 我正在使用自动迁移。因此,在构建并运行“更新数据库”后,使用以下字段创建了问题表: 身份证 应用程序用户Id 信使 客户ID 我的问题是为什么要创建“ApplicationUser

我试图在“ApplicationUser”类和最近创建的“Issue”类之间创建一个“一对多”关系

因此,在Models/IdentityModels.cs/ApplicationUser中,我添加了以下属性:

public ICollection<Issue> Issues { get; set; }
我正在使用自动迁移。因此,在构建并运行“更新数据库”后,使用以下字段创建了问题表:

  • 身份证
  • 应用程序用户Id
  • 信使
  • 客户ID

  • 我的问题是为什么要创建“ApplicationUser_Id”字段以及如何防止它?

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

    • 一个用于
      ApplicationUser
      (ApplicationUser\u Id)上的
      i收集问题
    • 一个用于
      发行的
      应用程序用户快递
      (CourierId)
    • 一个用于
      问题的
      应用程序用户客户
      (客户ID)
    (请注意,EF允许从任意一方定义关系。)

    如果您希望
    ApplicationUser.Issues
    包含此用户的所有问题,无论他是快递员还是客户,您将需要额外的ApplicationUser\u Id密钥。配置EF以使其正常工作将是一件非常痛苦的事情

    也许一个更简单的解决方案可以做到:在
    ApplicationUser
    上引入两个集合

    public ICollection<Issue> CourierIssues { get; set; }
    public ICollection<Issue> CustomerIssues { get; set; }
    
    公共ICollection信使{get;set;} 公共ICollection客户问题{get;set;}
    然后使用fluent API在ModelBuilder中配置反向链接,以消除应用程序用户Id键:

     modelBuilder.Entity<ApplicationUser>().HasMany(au => au.CourierIssues).WithOptional(i => i.Courier);
     modelBuilder.Entity<ApplicationUser>().HasMany(au => au.CustomerIssues).WithOptional(i => i.Customer);
    
    modelBuilder.Entity();
    modelBuilder.Entity().HasMany(au=>au.CustomerIssues)。带可选(i=>i.Customer);
    
    因为您有两个外键,分别指向
    ApplicationUser
    Courier
    Customer
    ,但只有一个集合引用
    问题
    。EF无法知道它应该与哪个外键对齐,所以它只是创建了一个新的外键。要正确处理此问题,您需要使用fluent配置:

    public class ApplicationUser
    {
        ...
    
        public class Mapping : EntityTypeConfiguration<ApplicationUser>
        {
            HasMany(m => m.Issues).WithRequired(m => m.Customer);
        }
    }
    
    HasMany(m => m.CustomerIssues).WithRequired(m => m.Customer);
    HasMany(m => m.CourierIssues).WithRequired(m => m.Courier);
    
    当然,这里的问题是,您可能希望跟踪
    客户
    快递公司
    的收款情况。为此,您需要两个集合:

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

    新增财产的目的是什么?它应该包含的内容-用户是
    信使
    还是
    客户
    的问题?您是否使用了代码优先迁移模式?在执行迁移之前,可能需要在PK字段上设置
    KeyAttribute
    ,以保留已定义的主键并创建表关系。
    public virtual ICollection<Issue> CustomerIssues { get; set; }
    public virtual ICollection<Issue> CourierIssues { get; set; }
    
    HasMany(m => m.CustomerIssues).WithRequired(m => m.Customer);
    HasMany(m => m.CourierIssues).WithRequired(m => m.Courier);