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
Fluent API 需要在代码中指定外键,比如
modelBuilder.Entity<Items>()
.HasRequired(o => o.User)
.WithMany(c => c.Items)
.HasForeignKey(o => o.UserId);
当您通过 EF 加载项目时,它需要创建 User
和 Item
的新实例。在幕后,EF 将为每个新实例调用构造函数。你的问题出在你的构造函数中:
public User()
{
Id = Guid.NewGuid(); // <- here
}
每次创建实例时,您的构造函数都会重新分配一个新 ID,这会破坏引用完整性并导致各种其他问题。
您的代码不知道创建新 User
和 从数据库重新创建 User
实例之间的区别。
我建议从您的构造函数中删除赋值并将其放置在静态 Create
方法中或放置在您创建新 User
或 Item
.[=18 的任何地方=]
p.s。 WPF 与您这里的问题无关。
我首先使用 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
Fluent API 需要在代码中指定外键,比如
modelBuilder.Entity<Items>()
.HasRequired(o => o.User)
.WithMany(c => c.Items)
.HasForeignKey(o => o.UserId);
当您通过 EF 加载项目时,它需要创建 User
和 Item
的新实例。在幕后,EF 将为每个新实例调用构造函数。你的问题出在你的构造函数中:
public User()
{
Id = Guid.NewGuid(); // <- here
}
每次创建实例时,您的构造函数都会重新分配一个新 ID,这会破坏引用完整性并导致各种其他问题。
您的代码不知道创建新 User
和 从数据库重新创建 User
实例之间的区别。
我建议从您的构造函数中删除赋值并将其放置在静态 Create
方法中或放置在您创建新 User
或 Item
.[=18 的任何地方=]
p.s。 WPF 与您这里的问题无关。