不确定标题是否足够好,但我会尝试解释我遇到的问题。为了记录,我对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 将被其他对象使用,因此内容中的外键无法解决我的问题。
答案 0 :(得分:1)
嗯......从哪里开始。 :)
您不需要映射Object和Object的ID。事实上EF不会喜欢这个。
就像这样的代码将为您提供所需的代码:
<德尔> [必需] [键] public Guid DescriptionId {get;组; } 德尔>
[Required]
public virtual ICollection<Content> Description { get; set; }
您尝试使用的流畅映射适用于多对多关系。如果代码首次迁移不起作用,或者如果要指定自己的列或表名,则只需指定fluent映射。删除双重映射后,您可能不需要指定任何特殊的流畅。代码首先只是找出列需要的内容并为您创建它们(除非您使用的是现有数据库)。如果您发现仍需要流利,请确保使用正确的映射。
最后,我认为您无法使用映射解决问题。映射您的实体,以便将它们联系起来。不确定你的第二个实体是什么名字,但是这里......
Winning有一系列标题和描述?然后,当您在页面上显示此信息时,您只需要使用控制器中的某些代码/逻辑来根据应用程序的当前条件决定在视图中使用哪个标题和描述。也许你的控制器方法中有一些东西可以说出你需要的语言等等。
希望能让你重回正轨。