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

时间:2018-03-05 12:13:54

标签: c# wpf entity-framework mahapps.metro

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

但当我将表加载到ObservableCollection然后将其绑定到datagrid表正常列时,将其数据正常加载到外键的datagrid excpet中,这些外键除了显示时我插入一个断点来查看ObservableCollection内的数据我可以看到来自Users and Units表的所有东西都在那里

 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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

我建议您从构造函数中删除分配,并将其置于静态Create方法或地方,无论您在何处创建新的UserItem

P.S。 WPF与您的问题无关。

答案 1 :(得分:0)

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

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