我有一个桌子留言和一个桌子公寓。 消息的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
答案 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配置之间感到困惑。
我也不建议单独使用区分大小写的成员,因为我可以保证这会导致代码混淆,这将导致代码中的错误。 :)