防止实体框架代码首先生成外来外键,而不使用Fluent?

时间:2019-03-11 23:30:35

标签: entity-framework ef-code-first

我具有给定关系的以下POCOS:

ProductTransferHistory [1-*] <-- ProductTransferHistoryEntry [1-*] <-- WipEntry

代码如下:

public class ProductTransferHistory
{
    [Key]
    public Int32 ProductTransferHistoryId { get; set; }

    public DateTime TransactionDate { get; set; }

    [InverseProperty(nameof(ProductTransferHistoryEntry.ProductTransferHistory))]
    public ICollection<ProductTransferHistoryEntry> ProductTransferHistoryEntries { get; set; }

    public IList<ProductTransferHistoryEntry> EntriesWithName => ProductTransferHistoryEntries.Where(x => x.Name != null).ToList();
}

public class ProductTransferHistoryEntry
{
    [Key]
    public Int32 ProductTransferHistoryEntryId { get; set; }

    [ForeignKey(nameof(ProductTransferHistoryId))]
    public ProductTransferHistory ProductTransferHistory { get; set; }

    public Int32 ProductTransferHistoryId { get; set; }

    public String Name { get; set; }        

    [InverseProperty(nameof(WipEntry.ProductTransferHistoryEntry))]
    public virtual ICollection<WipEntry> WipEntries { get; set; }

    public IList<WipEntry> NonZeroWipEntries => WipEntries.Where(x => x.Quantity != 0).ToList();
}

public class WipEntry
{
    [Key]
    public Int32 WipEntryId { get; set; }

    [ForeignKey(nameof(ProductTransferHistoryEntryId))]
    public ProductTransferHistoryEntry ProductTransferHistoryEntry { get; set; }

    public Int32 ProductTransferHistoryEntryId { get; set; } // associated entry of ProductTransferHistoryId

    public Decimal Quantity { get; set; }
}

由于某种原因,当我添加迁移时,对于ProductTransferHistoryEntries表,它会生成两个外键列: ProductTransferHistoryId 和一个_ProductTransferHistory_Id_列。然后在 WipEntry 表上创建两个FK列 ProductTransferHistoryEntryId 和_ProductTransferHistoryEntry_Id_。在这两种情况下,第二个FK都可以为空,这也没有意义。

问题似乎出在集合导航属性上。我以为“ InverseProperty”注释可以解决该程序,但它仍会生成额外的FK。如果删除nav集合属性,则不会生成多余的列,但这不是解决方案,因为我的LINQ to Entities需要这些属性。

我已经看到一些使用流畅的API解决此问题的解决方案。但是我想知道是否存在可以解决该问题的注释?

0 个答案:

没有答案