在EntityFramework中自动实例化OneToOne关系(结合WPF)
Automatically instantiate OneToOne Relationship in EntityFramework (in Combination with WPF)
我有两个 Classes:
- 图书
- MultilingualString(有很多翻译,但这对这个例子来说并不重要)
我的目标是自动实例化从 Book 到 MultilingualString (Book.Description
) 的引用。
这是一个相对复杂的应用程序,因此我将其简化为必要的代码。以下示例显示了我的应用程序如何与 EF 交互:
static void Main(string[] args)
{
using(var model = new ModelCFContext())
{
// Done by a generic ViewModel
var book = model.Set<Book>().Create();
// Currently I am instantiating book.Description inside the ViewModel (of Book in this case).
// Is there a better way?
book.Description = model.MultilingualStrings.Create();
// Set by TextBox-Binding
book.Description.TextDefault = "TestDefault3";
// Done by a generic ViewModel
Insert(model, book);
}
using (var model = new ModelCFContext())
{
OutputFirstBook(model);
}
Console.ReadKey();
}
private static void OutputFirstBook(ModelCFContext model)
{
var spez = model.Books.FirstOrDefault();
Console.WriteLine(spez.Description.TextDefault);
}
private static void Insert<T>(ModelCFContext model, T book) where T : class
{
model.Set<T>().Add(book);
model.SaveChanges();
}
通常我会在Book
的构造函数中实例化这样一个引用。但这不会起作用,因为 EntityFramework 不会注入代理(从数据库加载数据时)。
图书-Class:
[Table("Book")]
public partial class Book
{
public Book()
{
//Description = new MultilingualString();
}
[Key]
public int BookId { get; set; }
[Required]
public virtual MultilingualString Description { get; set; }
}
多语言字符串-Class:
[Table("MultilingualString")]
public partial class MultilingualString
{
public MultilingualString()
{
Translations = new ObservableCollection<Translation>();
}
[Key]
public int MultilingualStringId { get; set; }
public string TextDefault { get; set; }
public virtual ObservableCollection<Translation> Translations { get; set; }
}
我目前正在 Book 的 ViewModel 中实例化 book.Description。有更好的方法吗?
找到了一个解决方案,目前我会坚持使用。
我用BaseEntity
:
public class BaseEntity
{
public virtual void InitializeEntity() { }
}
我在 Book
中覆盖了它:
public override void InitializeEntity()
{
if(Description == null)
Description = new MultilingualString();
}
然后我可以在创建或加载实体后在我的通用 ViewModel (where TEntity : BaseEntity
) 中调用 InitializeEntity()
。
var entity = model.Set<TEntity>().Create();
entity.InitializeEntity();
var entity = model.Set<TEntity>().Find(keys);
entity.InitializeEntity();
之所以有效,是因为 Description
已经加载,我可以检查它是否是 null
。
我有两个 Classes:
- 图书
- MultilingualString(有很多翻译,但这对这个例子来说并不重要)
我的目标是自动实例化从 Book 到 MultilingualString (Book.Description
) 的引用。
这是一个相对复杂的应用程序,因此我将其简化为必要的代码。以下示例显示了我的应用程序如何与 EF 交互:
static void Main(string[] args)
{
using(var model = new ModelCFContext())
{
// Done by a generic ViewModel
var book = model.Set<Book>().Create();
// Currently I am instantiating book.Description inside the ViewModel (of Book in this case).
// Is there a better way?
book.Description = model.MultilingualStrings.Create();
// Set by TextBox-Binding
book.Description.TextDefault = "TestDefault3";
// Done by a generic ViewModel
Insert(model, book);
}
using (var model = new ModelCFContext())
{
OutputFirstBook(model);
}
Console.ReadKey();
}
private static void OutputFirstBook(ModelCFContext model)
{
var spez = model.Books.FirstOrDefault();
Console.WriteLine(spez.Description.TextDefault);
}
private static void Insert<T>(ModelCFContext model, T book) where T : class
{
model.Set<T>().Add(book);
model.SaveChanges();
}
通常我会在Book
的构造函数中实例化这样一个引用。但这不会起作用,因为 EntityFramework 不会注入代理(从数据库加载数据时)。
图书-Class:
[Table("Book")]
public partial class Book
{
public Book()
{
//Description = new MultilingualString();
}
[Key]
public int BookId { get; set; }
[Required]
public virtual MultilingualString Description { get; set; }
}
多语言字符串-Class:
[Table("MultilingualString")]
public partial class MultilingualString
{
public MultilingualString()
{
Translations = new ObservableCollection<Translation>();
}
[Key]
public int MultilingualStringId { get; set; }
public string TextDefault { get; set; }
public virtual ObservableCollection<Translation> Translations { get; set; }
}
我目前正在 Book 的 ViewModel 中实例化 book.Description。有更好的方法吗?
找到了一个解决方案,目前我会坚持使用。
我用BaseEntity
:
public class BaseEntity
{
public virtual void InitializeEntity() { }
}
我在 Book
中覆盖了它:
public override void InitializeEntity()
{
if(Description == null)
Description = new MultilingualString();
}
然后我可以在创建或加载实体后在我的通用 ViewModel (where TEntity : BaseEntity
) 中调用 InitializeEntity()
。
var entity = model.Set<TEntity>().Create();
entity.InitializeEntity();
var entity = model.Set<TEntity>().Find(keys);
entity.InitializeEntity();
之所以有效,是因为 Description
已经加载,我可以检查它是否是 null
。