使用不同的外键指定一对多关系

时间:2012-12-15 12:06:29

标签: c# entity-framework code-first

不确定标题是否足够好,但我会尝试解释我遇到的问题。为了记录,我对Code-First和Fluent API都很陌生,这是我使用它们的第一个生产项目。

基本上,我试图创建的网络应用程序是多语言的,我决定有一个包含以下字段的表格(我添加了评论来解释我想要实现的目标):

public class Content
{
    [Key]
    // Required Key.
    public int Id { get; set; }

    [Required]
    // Language (another class that stores culture and other culture specific info).
    public Language Language { get; set; }

    [Required]
    // Text for the current field.
    [Column(TypeName = "ntext")]
    public string Text { get; set; }

    [Required]
    // The field Id, this stores what field the text above relates to.
    // So if I have a field "Welcome", and the website has 5 languages, I'll have 5 entries with the same GUID
    // but with different text and different language.
    public virtual Guid FieldId { get; set; }
}

我一直在尝试很多解决方案,但我还没有设法创造我想要的东西。我最近的一个是:

    [Key]
    public int Id { get; set; }

    [Required]
    [Key]
    public Guid TitleId { get; set; }
    [Required]
    [Column("TitleId")]
    public virtual ICollection<Content> Title { get; set; }

    [Required]
    public decimal Value { get; set; }

    [Required]
    [Key]
    public Guid DescriptionId { get; set; }
    [Required]
    public virtual ICollection<Content> Description { get; set; }

这在上下文中(不确定是否有意义):

modelBuilder.Entity<Winning>()
    .HasMany(x => x.Description)
    .WithRequired()
    .Map(x =>
    {
        x.MapKey("DescriptionId", "FieldId")
            .MapKey("TitleId", "FieldId");
    });

基本上我想要的是当我加载上面的对象时,通过该GUID,我得到一个相关文本列表(最好只有一个,因为我按文化过滤),表 Content 将被其他对象使用,因此内容中的外键无法解决我的问题。

1 个答案:

答案 0 :(得分:1)

嗯......从哪里开始。 :)

您不需要映射Object和Object的ID。事实上EF不会喜欢这个。

就像这样的代码将为您提供所需的代码:

<德尔> [必需]     [键]     public Guid DescriptionId {get;组; }

[Required]
public virtual ICollection<Content> Description { get; set; }

您尝试使用的流畅映射适用于多对多关系。如果代码首次迁移不起作用,或者如果要指定自己的列或表名,则只需指定fluent映射。删除双重映射后,您可能不需要指定任何特殊的流畅。代码首先只是找出列需要的内容并为您创建它们(除非您使用的是现有数据库)。如果您发现仍需要流利,请确保使用正确的映射。

最后,我认为您无法使用映射解决问题。映射您的实体,以便将它们联系起来。不确定你的第二个实体是什么名字,但是这里......

Winning有一系列标题和描述?然后,当您在页面上显示此信息时,您只需要使用控制器中的某些代码/逻辑来根据应用程序的当前条件决定在视图中使用哪个标题和描述。也许你的控制器方法中有一些东西可以说出你需要的语言等等。

希望能让你重回正轨。