1

我需要根据 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; }
}

我想在 中插入一个新PictureAdCar,我试过:

AdPicture picture = new AdPicture()
{
    Ad = _adRepository.GetById(adId),
    Filename = newFileName
};

_pictureService.CreateAdPicture(picture);

创建广告图片:

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

4

2 回答 2

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)我不确定实体框架是否以不同的方式处理子类化,但我怀疑它必须。如果您在那里遗漏了什么,其他人有望更好地回答这个问题。

于 2013-02-04T15:44:02.960 回答
0

我发现了问题:

我在广告模型中定义了导航属性“public IList Pictures { get; set; }”,它在 SQL 命令“Ad_Id”中创建了一个附加字段。

我一删除它,问题就解决了,我对 TPH 的所有理论再次聚集在一起 :)

感谢您的反馈意见。

于 2013-02-05T09:52:00.370 回答