首页 > 解决方案 > EF Core 1:1 关系?

问题描述

我想要的桌子看起来像这样......

Identity  | Id (PK), Tag
Character | IdentityId (FK, PK), Health

字符表应该准确引用标识表的一行......并且标识表不应该引用任何其他 1:0。

我现在的模型看起来像这样......

    /// <summary>
    /// Represents an identity in our database. 
    /// </summary>
    public class Identity {

        public long Id { get; set; }
        public string Tag { get; set; }
    }
    
    /// <summary>
    /// Represents an character ingame with all his attributes. 
    /// </summary>
    public class Character {
        
        public Identity Identity { get; set; }

        public float Health { get; set; }
    }

    modelBuilder.Entity<Identity>(entity => {

          entity.ToTable("identity");
          entity.HasKey(e => e.Id);
    });
            
     modelBuilder.Entity<Character>(entity => {

          entity.ToTable("character");
          // entity.HasKey(e -> e.Identity.Id); DOES NOT WORK
          entity.Navigation(character => character.Identity).AutoInclude();
     });            

这样做的问题是对字符内部身份的引用不算作主键......也不是外键。

e -> e.Identity.Id由于某种原因不起作用并导致错误告诉我这是不可能的。

我希望IdentityCharacter 内部算作他的主键,同时仍然是对 Identity-Table (外键)内行的引用。然而,身份表不应引用该字符。

这可能吗 ?如果是这样……怎么办?

标签: c#mysqlentity-frameworkentity-framework-core

解决方案


您可以在 Identity 类中创建一个属性

 public class Identity {
        public long Id { get; set; }
        public string Tag { get; set; }

        public Character Character { get; set; }
    }

然后你的模型变成

modelBuilder.Entity<Identity>()
                .HasOne(x => x.Character)
                .WithOne(x => x.Identity)
                .HasForeignKey<Character>(x => x.YourFkKey);

推荐阅读