实体框架6.1 - 单一实体上的代码优先一对多:无法将PK映射到FK?

时间:2015-04-22 16:58:49

标签: sql-server entity-framework ef-code-first

我尝试首先使用代码在单个表/实体上执行一对多。我的实体看起来像这样,工作正常:

public class StockIndex
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [StringLength(45, MinimumLength = 3)]
    public string Name { get; set; }

    [StringLength(500)]
    public string Description { get; set; }

    public List<Component> Components { get; set; }

    public StockIndex ParentStockIndex { get; set; }
    public List<StockIndex> StockSubIndices { get; set; }

    public StockIndex()
    {
        StockSubIndices = new List<StockIndex>();
    }
}

它会创建一个包含PK和FK的表格,就像您期望的那样:

CREATE TABLE [dbo].[StockIndex] (
    [Id]                  INT            IDENTITY (1, 1) NOT NULL,
    [Name]                NVARCHAR (45)  NULL,
    [Description]         NVARCHAR (500) NULL,
    [ParentStockIndex_Id] INT            NULL,
    CONSTRAINT [PK_dbo.StockIndex] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_dbo.StockIndex_dbo.StockIndex_ParentStockIndex_Id] FOREIGN KEY ([ParentStockIndex_Id]) REFERENCES [dbo].[StockIndex] ([Id])
);

效果很好。我已经把所有的CRUD搭建起来了,一切正常。但是,这会强制我在进行编辑时在我的控制器中触发一个额外的查询,以便查找并分配一个父母&#34;记录到新的。我想访问&#34; ParentStockIndex_Id&#34;表中的字段,所以我可以直接从下拉列表中分配它,并跳过额外的查询查询。我试着映射它:

public class StockIndex
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [StringLength(45, MinimumLength = 3)]
    public string Name { get; set; }

    [StringLength(500)]
    public string Description { get; set; }

    public List<Component> Components { get; set; }

    public int ParentStockIndex_Id { get; set; }

    [ForeignKey("ParentStockIndex_Id")]
    public StockIndex ParentStockIndex { get; set; }

    public List<StockIndex> StockSubIndices { get; set; }

    public StockIndex()
    {
        StockSubIndices = new List<StockIndex>();
    }
}

但是当我在DbContext中播种数据时,我在运行时遇到异常:

无法确定&#39; MyApp.Models.StockIndex_ParentStockIndex&#39;的主要结尾。关系。多个添加的实体可能具有相同的主键。

我确定我做错了什么,但如果可能的话,我希望不使用Fluent这样做。

1 个答案:

答案 0 :(得分:0)

你应该使用Title.Text = string.Format(Properties.Resources.LockerNumberIsOpen, (this.DataContext as OpenParcelViewModel).PrefixWithNumber); var tr = this.Find((this.DataContext as OpenParcelViewModel).PrefixWithNumber); tr.ApplyPropertyValue(TextElement.ForegroundProperty, "#9ebb2b"); private TextRange Find(string w) { var si = Title.Text.IndexOf(w); var sp = Title.ContentStart.GetPositionAtOffset(si + 1); var ep = Title.ContentStart.GetPositionAtOffset(si + w.Length + 1); return new TextRange(sp, ep); } 来设置不需要的父级(你刚刚在int之后看到问号)。