实体类型“消息”中有多个导航指向相同的属性集-使用ForeignKeyAttribute的“ MessageFrom”

时间:2019-04-25 20:23:55

标签: c# entity-framework asp.net-core entity-framework-core

我有一个桌子留言和一个桌子公寓。 消息的MessageFrom与apartmentId有关,而MessageTo也与apartment id有关。 我像总是使用实体框架core一样实现我的代码。但是事情似乎并不正确。 这是我的代码:

1-应用程序DbContext

modelBuilder.Entity<Messages>(entity =>
            {
                entity.HasKey(e => e.MessageId);
                entity.Property(e => e.DateOfMessage).HasColumnType("DateTime");
                entity.Property(e => e.Message).HasColumnType("nvarchar(300)").HasMaxLength(300);
                entity.Property(e => e.IsRed).HasColumnName("IsRed").HasColumnType("bit");
                entity.Property(e => e.MessageTo).HasColumnType("int");
                entity.HasOne(e => e.Apartment).WithMany(x => x.Messages).HasForeignKey(e => e.MessageFrom).HasConstraintName("FK_MessageFrom_Apartment");
                entity.HasOne(e => e.Apartment).WithMany(x => x.Messages).HasForeignKey(e => e.MessageTo).HasConstraintName("FK_MessageTo_Apartment");

        });

2-模型类别:

  public class Messages
    {

        public int MessageId { get; set; }





        public int ?MessageFrom { get; set; }
        [ForeignKey("MessageFrom")]
        public Apartment Apartment { get; set; }


        public int ?MessageTo { get; set; }
        [ForeignKey("MessageTo")]
        public Apartment apartment { get; set; }
        [Required]
        public DateTime DateOfMessage { get; set; }
        [Required]
        public string Message { get; set; }

        public bool IsRed { get; set; }

    }

3-问题是: 实体类型“消息”中有多个导航指向相同的属性集-使用ForeignKeyAttribute的“ MessageFrom”

4-有时它给出: 无效的列名“ ApartmentId”。虽然我在模型消息中根本没有apartmentId

1 个答案:

答案 0 :(得分:0)

此代码在这里:

            entity.HasOne(e => e.Apartment).WithMany(x => x.Messages).HasForeignKey(e => e.MessageFrom).HasConstraintName("FK_MessageFrom_Apartment");
            entity.HasOne(e => e.Apartment).WithMany(x => x.Messages).HasForeignKey(e => e.MessageTo).HasConstraintName("FK_MessageTo_Apartment");

引用相同的导航属性。重命名和更新引用将使此代码损坏。

    public int ?MessageFrom { get; set; }
    [ForeignKey("MessageFrom")]
    public virtual Apartment ApartmentFrom { get; set; }


    public int ?MessageTo { get; set; }
    [ForeignKey("MessageTo")]
    public virtual Apartment ApartmentTo { get; set; }

有了这些归因成员,您就不需要/不想与modelBuilder重复,而使用其中一个。 ColumnType等也可以通过属性声明。我的猜测是EF在属性和modelBuilder配置之间感到困惑。

我也不建议单独使用区分大小写的成员,因为我可以保证这会导致代码混淆,这将导致代码中的错误。 :)