Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用不同的外键指定一对多关系_C#_Entity Framework_Code First - Fatal编程技术网

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

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

不确定标题是否足够好,但我将尝试解释我遇到的问题。作为记录,我对编写First和Fluent API非常陌生,这是我在其中使用它们的第一个生产项目

基本上,我尝试创建的web应用程序是多语言的,我决定创建一个包含以下字段的表(我添加了注释以解释我尝试实现的目标):

我一直在尝试许多解决方案,但我没有成功地创造出我想要的。我最新的一个是:

    [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; }