Автоматически создавать экземпляр OneToOne Relationship в EntityFramework (в сочетании с WPF) - PullRequest
0 голосов
/ 26 марта 2020

У меня есть два класса:

  • Книга
  • MultilingualString (имеет много переводов, но это не важно для этого примера)

Моя цель это автоматическое создание ссылки из книги на 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 не будет вводить прокси (при загрузке данных из базы данных).

Book-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; }


}

MultilingualString-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; }
}

Я сейчас создаю экземпляр книги. Описание в ViewModel of Book. Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 27 марта 2020

Нашел решение, с которым я сейчас буду придерживаться.

Я использую BaseEntity:

public class BaseEntity
{
    public virtual void InitializeEntity() { }
}

Который я переопределяю в Book:

public override void InitializeEntity()
{
    if(Description == null)
        Description = new MultilingualString();
}

И тогда я могу вызвать InitializeEntity() в моем универсальном c ViewModel (where TEntity : BaseEntity) после создания или загрузки сущности.

var entity = model.Set<TEntity>().Create();
entity.InitializeEntity();
var entity = model.Set<TEntity>().Find(keys);
entity.InitializeEntity();

Причина, по которой это работает, заключается в том, что Description будет загружен, и я могу проверить, является ли он null или нет.

...