gpt4 book ai didi

entity-framework - 将复合外键映射到复合主键,其中外键也是主键

转载 作者:行者123 更新时间:2023-12-04 18:59:05 26 4
gpt4 key购买 nike

我想将 VM_hostname、datetime 和 name 属性作为 的复合键磁盘类 .同时的VM_hostname和datetime磁盘类 应引用 的 VM_hostname 和日期时间虚拟机类(即外键)。

我这样做了,但它给了我这个异常(exception):
'WebJob1.Historical.Disk' 类型的属性 'datetime' 上的 ForeignKeyAttribute 无效。在依赖类型“WebJob1.Historical.Disk”上找不到导航属性“Datetime”。 Name 值应该是有效的导航属性名称

有人有线索吗?另外,请注意我正在使用数据注释。

public class VirtualMachine
{

[Key]
[Column(Order = 0)]
public string VM_Hostname { get; set; }
[Key]
[Column(Order = 1)]
public DateTime Datetime;
public virtual List<Disk> disks { get; set; }
}

public class Disk
{
[Key,ForeignKey("VirtualMachine"),Column(Order = 0)]
public string VM_hostname { get; set; }
[Key,ForeignKey("Datetime"), Column(Order = 1)]
public DateTime datetime { get; set; }
[Key, Column(Order = 2)]
public string name { get; set; }

public virtual VirtualMachine VirtualMachine{ get; set; }


}

最佳答案

您的问题与我建议的问题之间的主要区别 duplicate是你的ForeignKey属性不指 -

  • 从原始属性到导航属性
  • 从导航属性到原始属性

  • 在您的情况下,引用是从原始属性到另一种类型的另一个原始属性。还有,小细节, VirtualMachine.Datetime应该是属性,而不是成员。但我不得不承认,“重复”并未涵盖您的情况。
    因此,让我们尝试将其变成如何在 Entity Framework 6 中处理这种情况的综合答案。我将使用一个抽象模型来解释各种选项:
    public class Parent
    {
    public int Id1 { get; set; } // Key
    public int Id2 { get; set; } // Key
    public string Name { get; set; }
    public virtual List<Child> Children { get; set; }
    }

    public class Child
    {
    public int Id1 { get; set; } // Key
    public int Id2 { get; set; } // Key
    public int Id3 { get; set; } // Key
    public string Name { get; set; }
    public virtual Parent Parent { get; set; }
    }
    有三个选项可以设置映射。
    选项1
    数据注释, ForeignKey属性:
    public class Parent
    {
    [Key]
    [Column(Order = 1)]
    public int Id1 { get; set; }
    [Key]
    [Column(Order = 2)]
    public int Id2 { get; set; }

    public string Name { get; set; }

    public virtual List<Child> Children { get; set; }
    }

    public class Child
    {
    [Key]
    [Column(Order = 0)]
    public int Id1 { get; set; }
    [Key]
    [Column(Order = 1)]
    public int Id2 { get; set; }
    [Key]
    [Column(Order = 2)]
    public int Id3 { get; set; }

    public string Name { get; set; }

    [ForeignKey("Id1,Id2")]
    public virtual Parent Parent { get; set; }
    }
    如您所见,这里是 ForeignKey属性是指从导航属性到原始属性。此外,列顺序中的绝对数字无关紧要,只有它们的顺序。
    选项 2
    数据注释, InverseProperty属性:
    public class Parent
    {
    [Key]
    [Column(Order = 1)]
    public int Id1 { get; set; }
    [Key]
    [Column(Order = 2)]
    public int Id2 { get; set; }

    public string Name { get; set; }

    public virtual List<Child> Children { get; set; }
    }

    public class Child
    {
    [Key]
    [Column(Order = 0)]
    [InverseProperty("Children")]
    public int Id1 { get; set; }
    [Key]
    [Column(Order = 1)]
    [InverseProperty("Children")]
    public int Id2 { get; set; }
    [Key]
    [Column(Order = 2)]
    public int Id3 { get; set; }

    public string Name { get; set; }

    public virtual Parent Parent { get; set; }
    }
    InverseProperty从关系一端的类型中的一个或多个属性指向关系另一端类型中的导航属性。实现相同映射的另一种方法是应用 [InverseProperty("Parent")]Parent 的两个关键属性上.
    选项 3
    流畅的映射:
    modelBuilder.Entity<Parent>().HasKey(p => new { p.Id1, p.Id2 });
    modelBuilder.Entity<Child>().HasKey(p => new { p.Id1, p.Id2, p.Id3 });
    modelBuilder.Entity<Parent>()
    .HasMany(p => p.Children)
    .WithRequired(c => c.Parent)
    .HasForeignKey(c => new { c.Id1, c.Id2 });
    正如评论中所说,流畅的映射比数据注释更不容易出错。数据注释提供了太多配置映射的选项,而且查看哪些部分连接起来并不总是那么容易。这就是为什么流畅的映射是我的最爱。
    Entity Framework 核心
    在 EF-core(当前版本 3.1.6)中,复合主键不能通过数据注释建模。它抛出一个运行时异常:

    Entity type 'Parent' has composite primary key defined with data annotations. To set composite primary key, use fluent API.


    所以对于 EF-core 只有选项 3 是可行的。映射几乎相同:
    modelBuilder.Entity<Parent>().HasKey(p => new { p.Id1, p.Id2 });
    modelBuilder.Entity<Child>().HasKey(p => new { p.Id1, p.Id2, p.Id3 });
    modelBuilder.Entity<Parent>()
    .HasMany(p => p.Children)
    .WithOne(c => c.Parent) // Different here
    .HasForeignKey(c => new { c.Id1, c.Id2 });

    关于entity-framework - 将复合外键映射到复合主键,其中外键也是主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42819359/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com