【发布时间】:2015-12-04 20:23:18
【问题描述】:
被这个奇怪的问题困扰了好几个小时。由于某种原因,实体框架不会加载这种一对多关系的导航属性,即使生成的 SQL 似乎是正确的,从 SubItems 到 FrontPageItems 存在外键:
CONSTRAINT [FK_dbo.SubItems_dbo.FrontPageItems_FrontPageItemId]
FOREIGN KEY ([FrontPageItemId])
REFERENCES [dbo].[FrontPageItems] ([Id]) ON DELETE CASCADE
我已尝试使用以下方式加载所有首页项目:
_repo.Get();,但即使 SubItem 表包含引用 FronPageItems 表的外键,也不会加载导航属性。
public class FrontPageItem : Logger, IEntity, IIsPublished
{
public FrontPageItem()
{
SubItems = new HashSet<SubItem>();
}
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool IsPublished { get; set; }
public virtual ICollection<SubItem> SubItems { get; set; }
}
public class SubItem : Logger, IEntity, IIsPublished
{
public SubItem()
{
FrontPageItem = new FrontPageItem();
}
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string YoutubeUrl { get; set; }
public virtual FrontPageItem FrontPageItem { get; set; }
public int FrontPageItemId { get; set; }
public bool IsPublished { get; set; }
}
public class SampleContext : IdentityDbContext<ApplicationUser>
{
// throwIfV1Schema is used when upgrading Identity in a database from 1 to 2.
// It's a one time thing and can be safely removed.
public SampleContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static SampleContext Create()
{
return new SampleContext();
}
// Define you conceptual model here. Entity Framework will include these types and all their references.
public IDbSet<FrontPageItem> FrontPageItem { get; set; }
public IDbSet<SubItem> SubItems { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// The DateTime type in .NET has the same range and precision as datetime2 in SQL Server.
// Configure DateTime type to use SQL server datetime2 instead.
modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
base.OnModelCreating(modelBuilder);
}
}
顺便说一句,如果我删除 SubItem 中的外键属性,它会起作用:
公共 int FrontPageItemId { 获取;放; }
我尝试过像这样使用 include 进行预加载:
var frontPageItems = _repo.AsQueryable().Include(o => o.SubItems).ToList();
【问题讨论】:
-
什么是
_repo.Get()?为什么您希望它自动为您加载相关实体?您是否启用了延迟加载? -
你在哪里告诉 EF 它应该如何处理你的关系?我缺少类似 HasRequired(si=> si.FrontPageItem) .WithMany(fpi=> fpi.SubItems) .HasForeignKey(si=> si.FrontPageItemId );
-
我使用约定,它似乎生成了正确的 SQL:CONSTRAINT [FK_dbo.SubItems_dbo.FrontPageItems_FrontPageItemId] FOREIGN KEY ([FrontPageItemId]) REFERENCES [dbo].[FrontPageItems] ([Id]) ON删除级联
标签: c# asp.net-mvc entity-framework