在EntityFramework中自动实例化OneToOne关系(结合WPF)

Automatically instantiate OneToOne Relationship in EntityFramework (in Combination with WPF)

我有两个 Classes:

我的目标是自动实例化从 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