同一张表上的两个主键和外键

寄件人

我有两个表,其中一个与另一个表相关。第一张桌子

 public class Text
  {
    [Key]
    [Column(Order = 1)]
    [Required]
    [MinLength(7)]
    [MaxLength(7)]
    public string Fieldname { get; set; }

    [Key]
    [Column(Order = 2)]
    [Required]
    public virtual Language Language { get; set; }

    [MaxLength(50)]
    [MinLength(1)]
    [Required]
    public string Description { get; set; }
  }

第二张表:

public class Language
  {
    [Key]
    [Required]
    [MaxLength(2), MinLength(2)]
    public string Code { get; set; }
    [Required]
    public string Country { get; set; }
  }

种子数据如下所示:

context.Language.AddOrUpdate(
        new Language() {Code = "DE", Country = "German"},
        new Language() {Code = "EN", Country = "English"});

context.Text.AddOrUpdate(
        new Text { Fieldname = "TEXT001", Description = "Server", Language = context.Language.First(e => e.Code == "EN") },
        new Text { Fieldname = "TEXT001", Description = "Server", Language = context.Language.First(e => e.Code == "DE") }
      );

我更新数据库,并收到以下错误消息:

System.Data.Entity.Core.UpdateException:更新条目时发生错误。有关详细信息,请参见内部异常。---> System.Data.SqlClient.SqlException:违反主键约束'PK_dbo.Texts'。无法在对象“ dbo.Texts”中插入重复键。重复的键值为(TEXT001)。

怎么了?

阿迪尔·玛玛多夫(Adil Mammadov)

@IvanStoev的答案是正确的。但我想展示另一个选择。我建议使用Fluent API映射您的类。相信我,这样一来,您的模型将更加清晰,映射也易于理解。

文本模型及其映射:

public class Text
{
    public string FieldName { get; set; }  
    public string LanguageCode { getl set; } // Add this foriegn key property
    public string Description { get; set; }

    // Navigation properties
    public virtual Language Language { get; set; }
}

internal class TextMap
    : EntityTypeConfiguration<Text>
{
    public TextMap()
    {
        // Primary key
        this.HasKey(m => new { m.FieldName, m.LanguageCode });

        this.Property(m => m.FieldName)
                .HasMaxLength(7)
                .IsFixedLength();

        this.Property(m => m.LanguageCode)
                .HasMaxLength(2)
                .IsFixedLength();

        // Properties
        this.Property(m => m.Description)
            .IsRequired()
            .HasMaxLength(50);                      

        // Relationship mappings
        this.HasRequired(m => m.Language)
            .WithMany()
            .HasForeignKey(m => m.LanguageCode)
            .WillCascadeOnDelete(false);
    }
}

语言模型及其映射:

public class Language
{
    public string Code { get; set; }
    public string Country { get; set; }
}

internal class LanguageMap
    : EntityTypeConfiguration<Language>
{
    public LanguageMap()
    {
        // Primary key
        this.HasKey(m => m.Code);

        this.Property(m => m.Code)
                .HasMaxLength(2)
                .IsFixedLength();

        // Proeprties
        this.Property(m => m.Country)
            .IsRequired();
    }
}

然后,您应该覆盖OnModelCreatingDbContext的方法并将映射添加为:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new TextMap());
    modelBuilder.Configurations.Add(new LanguageMap());
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

同一张表上的两个外键以显示父字段

同一张表上的两个外键:如何在删除级联上实现?

MYSQL:通过同一张表中的两个外键选择

EF Core 2.2-同一张表的两个外键

MySql可以在一张表中设置一个主键的两个外键吗?

同一张表中的两列和同一外键

EF 6如何将两个外键设置到同一张表

同一张表上的外键

2个外键引用同一张表

当两个外键指向同一张表时如何使用Factory boy

根据同一张表中的两个键获取记录数组

同一张表中的两个JOINS

选择引用同一个主键表的两个外键的名称

在同一张表上用两个不同的条件缩短左联接

PostgreSQL-它会在同一张表上使用两个索引吗?

同一张表上的两个select语句并获得Count(*)

加入同一个表中的两个外键引用同一个主键

两列引用同一张表的表中的外键约束

同一张表中的多个外键

在同一张表中使用多个外键

与同一张表的2个外键有一对多关系Ruby on Rails

MySQL创建一个可空的外键,该外键引用同一张表上的id字段

在同一张表上加入外键并显示父子

Laravel口才关系在同一张表上具有相同的外键

如何使用Sequelize在同一张表上创建外键?

(MySQL)2个外键引用同一张表

MYSQL:同一张表上的两个联接成为双重分组计数。如何解决?

如何在MySQL的同一张表上使用join合并这两个查询?

如何在Postgresql中将两个选择查询水平组合在同一张表上?