WPF实体框架外键不会在DataGrid中加载它的值

问题描述 投票:1回答:2

我首先使用实际框架代码与流畅的API我有一个项目表与来自用户和单位表的外键

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

 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

c# wpf entity-framework mahapps.metro
2个回答
0
投票

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

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

2
投票

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

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

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

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

我建议从构造函数中删除赋值,并将其置于静态Create方法或放置在任何创建新UserItem的位置。

附: WPF与您的问题无关。

© www.soinside.com 2019 - 2024. All rights reserved.