C# 使用不同的外键指定一对多关系
不确定标题是否足够好,但我将尝试解释我遇到的问题。作为记录,我对编写First和Fluent API非常陌生,这是我在其中使用它们的第一个生产项目 基本上,我尝试创建的web应用程序是多语言的,我决定创建一个包含以下字段的表(我添加了注释以解释我尝试实现的目标): 我一直在尝试许多解决方案,但我没有成功地创造出我想要的。我最新的一个是:C# 使用不同的外键指定一对多关系,c#,entity-framework,code-first,C#,Entity Framework,Code First,不确定标题是否足够好,但我将尝试解释我遇到的问题。作为记录,我对编写First和Fluent API非常陌生,这是我在其中使用它们的第一个生产项目 基本上,我尝试创建的web应用程序是多语言的,我决定创建一个包含以下字段的表(我添加了注释以解释我尝试实现的目标): 我一直在尝试许多解决方案,但我没有成功地创造出我想要的。我最新的一个是: [Key] public int Id { get; set; } [Required] [Key] public G
[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; }
[Key]
公共int Id{get;set;}
[必需]
[关键]
公共Guid标题ID{get;set;}
[必需]
[列(“标题”)]
公共虚拟ICollection标题{get;set;}
[必需]
公共十进制值{get;set;}
[必需]
[关键]
公共Guid描述符ID{get;set;}
[必需]
公共虚拟ICollection描述{get;set;}
这在上下文中(不确定是否有意义):
modelBuilder.Entity()
.HasMany(x=>x.Description)
.WithRequired()
.Map(x=>
{
x、 MapKey(“DescriptionId”、“FieldId”)
.MapKey(“TitleId”、“FieldId”);
});
基本上,我想要的是,当我加载上面的对象时,通过该GUID,我会得到一个相关文本列表(最好只有一个,因为我会按区域性过滤),表内容将被其他对象使用,因此内容中的外键不会解决我的问题。Hm。。从哪里开始。:)
您不需要同时映射对象和对象的ID。事实上,EF不会喜欢这样的
类似这样的操作将获得所需的代码优先映射:
[必需]
[关键]
公共Guid描述符ID{get;set;}
[必需]
公共虚拟ICollection描述{get;set;}
您尝试使用的流畅映射适用于多对多关系。如果代码优先迁移不起作用,或者如果要指定自己的列名或表名,则只需要指定fluent映射。一旦删除了双映射,可能就不需要在fluent中指定任何特殊的内容。CodeFirst将只计算出该列需要是什么,并为您创建它们(除非您使用的是现有数据库)。如果您发现仍然需要fluent,请确保使用了正确的映射
最后,我认为使用映射无法解决问题。映射实体,以便将实体关联在一起。不确定第二个实体的名称,但这里是
Winning有一个标题和描述的集合?然后,当您在页面上显示此信息时,您只需要在控制器中使用一些代码/逻辑,根据应用程序的当前条件来决定将在视图中使用哪个标题和描述。也许你的控制器方法中有一些东西可以说明你需要什么语言等等
希望这能让你重回正轨。RE:DescriptionId&TitleId,可以理解,我正在努力学习我在网上找到的一些教程。如果我只包含ICollection,它将与Id连接,而不是与FieldId连接。我需要通过FieldId而不是Id将描述与内容连接起来。。。但不确定这是如何完成的…在您发布的代码中,描述的类型是content。我被你的对象模型搞糊涂了。您在示例中列出的第二个模型的类名是什么?在这种情况下,它是赢的,我省略了它,因为它可以是任何东西,内容只是一段绑定到语言和字段的文本。好的,您想要它,以便FieldId中的GUID指定它是赢的标题,或者是对胜利的描述,或者是对其他物体的描述?是吗?Daryl我想你有两个选择。更改模型,使winning.description与所有其他内容引用的关系为1:1。在单独的模型/表格中将您的翻译再向下移动1级。内容与翻译有一对多的关系。每个翻译都有fk返回内容。然后实体框架可以使用键引用内容,这正是它所需要的。或者忘记尝试让EF认识到这种关系。将guid作为属性添加到模型中,然后使用linq手动拉入相关数据。祝你好运
[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");
});
[Required]
public virtual ICollection<Content> Description { get; set; }