2014-06-11 47 views
0

我有一个数据库与两个表链接。当我运行初始迁移时,即使这不在我的模型中,我仍会添加额外的Analysis_Id字段。代码第一次迁移添加加下划线字段

我的基本设置是一个分析将有一段时间的结帐历史(1到很多)。但是在任何时候它只会有1个(由分析表上的CheckedOutById表示)。

public class CheckOut 
{ 
    public int Id { get; set; } 

    [ForeignKey("ByUser")] 
    public int ByUserId { get; set; }   
    public virtual UserProfile ByUser { get; set; } 

    public int AnalysisId { get; set; } 
    [ForeignKey("AnalysisId")] 
    public virtual Analysis Analysis { get; set; } 

    public DateTime At { get; set; } 
} 

public class Analysis 
{ 
    public Analysis() 
    { 
     Revisions = new Collection<AnalysisRevision>(); 
    } 

    public int Id { get; set; } 

    public string Name { get; set; } 

    public int SupplierSeasonId { get; set; } 
    public virtual SupplierSeason SupplierSeason { get; set; } 

    [ForeignKey("CheckedOutById")] 
    public virtual CheckOut CheckedOutBy { get; set; } 
    public int? CheckedOutById { get; set; } 

    public DataState DataState { get; set; } 

    public virtual ICollection<CheckOut> CheckOuts { get; set; } 
    public virtual ICollection<AnalysisRevision> Revisions { get; set; } 

    [ForeignKey("SourceId")] 
    public virtual AnalysisSource Source { get; set; } 
    public int SourceId { get; set; } 
} 

生成的迁移

 CreateTable(
      "dbo.CheckOut", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        ByUserId = c.Int(nullable: false), 
        AnalysisId = c.Int(nullable: false), 
        At = c.DateTime(nullable: false), 
        Analysis_Id = c.Int(), // The rogue column 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.Analysis", t => t.AnalysisId, cascadeDelete: true) 
      .ForeignKey("dbo.UserProfile", t => t.ByUserId, cascadeDelete: true) 
      .ForeignKey("dbo.Analysis", t => t.Analysis_Id) 
      .Index(t => t.ByUserId) 
      .Index(t => t.AnalysisId) 
      .Index(t => t.Analysis_Id); 

而对于分析表脚本(注意流氓CHECKOUT_ID场)

    CreateTable(
      "dbo.Analysis", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        Name = c.String(), 
        SupplierSeasonId = c.Int(nullable: false), 
        CheckedOutById = c.Int(), 
        DataState = c.Int(nullable: false), 
        SourceId = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.SupplierSeason", t => t.SupplierSeasonId, cascadeDelete: true) 
      .ForeignKey("dbo.CheckOut", t => t.CheckedOutById) 
      .ForeignKey("dbo.AnalysisSource", t => t.SourceId, cascadeDelete: true) 
      .Index(t => t.SupplierSeasonId) 
      .Index(t => t.CheckedOutById) 
      .Index(t => t.SourceId); 

回答

3

实体框架只是做你告诉它做什么。注意你在AnalysisCheckOut之间有两个关系。

首先您有一对一的关系,并且使用CheckedOutByIdAnalysisId存储该关系。

那么你也有一个一对多的关系,因为在Analysis实体的导航属性CheckOuts的,但CheckOut实体的外键来存储这种关系和Entity Framework是产生一个给你。

我还发现了其他问题,也许你想看看:

  • 属性[ForeignKey("ByUser")]是错误的。
  • 如果您使用命名约定,则不需要使用ForeignKey属性。
  • 在构造函数中初始化导航属性将禁用更改跟踪代理(我相信会抛出异常),因为您将覆盖EF正在为您创建的集合。

编辑: 您可以使用此代码来设置使用流畅API的关系。我对你的代码做了一些假设,但它应该可以工作。在你的DbContext课堂上使用这个。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<CheckOut>().HasRequired(c => c.Analysis).WithOptional(a => a.CheckedOutBy); 
    modelBuilder.Entity<Analysis>().HasMany(a => a.CheckOuts).WithRequired(c => c.AnalysisMany); 
} 
+0

感谢您的评论。关于一对一。所以我想没有办法从Analysis到CheckOut的关系基本上就是我想要的而不会产生这个额外的属性? – dreza

+0

@dreza如果你只想要一对一的关系,那么你应该删除导航属性'ICollection CheckOuts' – agarwaen

+0

我希望这两个。我希望Analysis包含结帐列表,但我也希望它包含对最近一个的引用...... – dreza