我尝试首先使用代码在单个表/实体上执行一对多。我的实体看起来像这样,工作正常:
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这样做。
答案 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之后看到问号)。