我首先使用实际框架代码与流畅的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的测试项目
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
的位置。
附: WPF与您的问题无关。