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