WPF Entity Framework 外键不会在 DataGrid 中加载它的值

WPF Entity Framework Foreign key won't load it's value in a DataGrid

我首先使用 Entity Framework 流畅的代码 API 我有一个项目 table 带有来自用户和单位的外键 tables

但是当我将 table 加载到 ObservableCollection 然后将其绑定到 datagrid 时 table 正常列将其数据正常加载到 datagrid excpet 外键什么都不显示,但当我插入一个断点以查看 ObservableCollection 内的数据时,我可以看到来自用户和单位 table 的所有内容都在那里

 private void MainContentsWindow_ContentRendered(object sender, EventArgs e)
    {
         using (var db2 = new DataContext())
         {
             var AllItems2 = new ObservableCollection<Model.Items.Item>(db2.Items);
             ItemsDataGrid.ItemsSource = AllItems2;
         }
    }

用户

public class User
{
    public User()
    {
        Id = Guid.NewGuid();
        IsActive = false;
    }

    public Guid Id { get; set; }

    public string Name { get; set; }

    public string Password { get; set; }

    public UserGroup Group { get; set; }

    public bool IsActive { get; set; }

    public virtual ICollection<Items.Item> Items { get; set; } = new List<Items.Item>();
}

public enum UserGroup
{
    Administrator = 1,
    User,
    Unknown
}

基地

public class NormalBaseModel : CommonBase
{
    public NormalBaseModel()
    {
        Id = new Guid();
        CreateDate = DateTime.Now;
        EditDate = null;
    }

    public Guid Id { get; set; }

    public string Notes { get; set; }

    public virtual User CreateBy { get; set; }

    public DateTimeOffset? CreateDate { get; set; }

    public virtual User EditBy { get; set; }

    public DateTimeOffset? EditDate { get; set; }
}

public class Item : NormalBaseModel
{
    public string NameAr { get; set; }

    public string NameEn { get; set; }

    public int? ManualId { get; set; }

    public string Barcode { get; set; }

    public byte?[] Image { get; set; }

    public virtual Unit Unit { get; set; }

    public string MadeIn { get; set; }

    public bool IsSerail { get; set; }

    public bool IsExpire{ get; set; }

}

这是Github上的一个测试项目 https://github.com/ahmedpiosol/psychic-parakeet.git

https://imgur.com/a/zimd4

Fluent API 需要在代码中指定外键,比如

 modelBuilder.Entity<Items>()
             .HasRequired(o => o.User)
             .WithMany(c => c.Items)
             .HasForeignKey(o => o.UserId);

当您通过 EF 加载项目时,它需要创建 UserItem 的新实例。在幕后,EF 将为每个新实例调用构造函数。你的问题出在你的构造函数中:

public User()
{
    Id = Guid.NewGuid(); // <- here
}

每次创建实例时,您的构造函数都会重新分配一个新 ID,这会破坏引用完整性并导致各种其他问题。

您的代码不知道创建新 User 从数据库重新创建 User 实例之间的区别

我建议从您的构造函数中删除赋值并将其放置在静态 Create 方法中或放置在您创建新 UserItem.[=18 的任何地方=]

p.s。 WPF 与您这里的问题无关。