在TPH体系结构中插入具有相关实体的实体

时间:2013-02-04 12:26:02

标签: c# sql asp.net-mvc entity-framework

我需要根据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_IdAd_Id,为什么?如何插入与Picture相关的AdCar

2 个答案:

答案 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的所有理论再次提出来了:)

感谢您的反馈。