我需要根据TPH架构插入一个包含相关实体(Picture
)的实体(Ad
):
Picture
型号:
public class Picture
{
// Primary properties
public int Id { get; set; }
public string Name { get; set; }
}
public class AdPicture : Picture
{
public Ad Ad { get; set; }
}
Ad
型号:
public class Ad
{
// Primary properties
public int Id { get; set; }
public string Title { get; set; }
}
public class AdCar : Ad
{
public int? CubicCapacity { get; set; }
public int? Power { get; set; }
}
我想在Picture
中插入新的AdCar
,我试过了:
AdPicture picture = new AdPicture()
{
Ad = _adRepository.GetById(adId),
Filename = newFileName
};
_pictureService.CreateAdPicture(picture);
CreateAdPicture:
public void CreateAdPicture(AdPicture adPicture)
{
_adPictureRepository.Add(adPicture);
_adPictureRepository.Save();
}
但实体框架说
*无效的列名称'AdCar_Id'。*
当我检查SQL命令文本时,我可以看到
insert [dbo].[Pictures]([Name], [Filename], [URL], [Rank], [Discriminator], [PictureType_Id], [AdCar_Id], [Ad_Id])
values (null, @0, null, @1, @2, @3, @4, null)
这是AdCar_Id
和Ad_Id
,为什么?如何插入与Picture
相关的AdCar
?
答案 0 :(得分:0)
首先:您可能需要明确将子类的键定义为Ad_Id
,因为它假设AdCar_Id
(反之亦然)。
你的DbContext中有这样的东西:
modelBuilder.Entity<AdPicture>()
.HasRequired(o => o.Ad)
.WithMany().Map(f => f.MapKey("Ad_Id"));
第二:另外,只是为了检查 - 所有这些类都有完全独立的表(TPH),而不是只有指定附加属性(TPH)的表。 AdPicture在Picture和AdPicture表中都没有数据?
没有完成TPH(仅TPT)我不确定Entity Framework是否以不同的方式处理子类,但我怀疑它必须。如果你错过了那些东西,别人可以更好地回答。
答案 1 :(得分:0)
我发现了问题:
我在广告模型中定义了导航属性“public IList Pictures {get; set;}”,该广告模型在SQL命令“Ad_Id”中创建了一个aditional字段。
一旦我删除它,问题就解决了,我对TPH的所有理论再次提出来了:)
感谢您的反馈。