0

不确定标题是否足够好,但我将尝试解释我遇到的问题。作为记录,我对 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将被其他对象使用,所以一个外国内容中的关键不能解决我的问题。

4

1 回答 1

1

嗯..从哪里开始。:)

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

像这样的东西会给你你想要的代码优先映射:

[必填] [Key] public Guid DescriptionId { get; 放; }

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

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

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

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

希望这能让你回到正确的轨道上。

于 2012-12-15T13:45:40.537 回答