Как реализовать простой «сложный тип» в Entity Framework Core 2 / C #? - PullRequest
0 голосов
/ 28 мая 2018

Я использую Entity Framework и .Net Core 2.0 впервые (я также довольно новичок в C #, но я использую традиционные .Net Framework и VB с версии 1 ... так что я 'я не новичок в разработке .Net), и я уже столкнулся с проблемой создания моей базы данных.

Возьмем такой простой сценарий: я хочу сохранить некоторую информацию о некоторых электронасосах.Два свойства представляют собой диапазон типов min / max, поэтому я реализовал их как простой класс, таким образом:

public class Pump
{
    [Key]
    public int pumpId { get; set; }
    public string pumpName { get; set; }
    public int pumpControlChannel { get; set; }
    public MinMax normalCurrent { get; set; }
    public MinMax normalFlowRate { get; set; }
}

[ComplexType]
public class MinMax
{
    public int min { get; set; }
    public int max { get; set; }
}

Как видите, я попытался использовать декоратор [ComplexType], чтобыбезрезультатно.

В любом случае, теперь создайте мертвый простой класс DBContext для управления моим классом Pumps.Я использую Sqlite:

public class EFDB : DbContext
{
    public DbSet<Pump> pumps { get; private set; }

    private static DbContextOptions GetOptions(string connectionString)
    {
        var modelBuilder = new DbContextOptionsBuilder();
        return modelBuilder.UseSqlite(connectionString).Options;
    }

    public EFDB(string connectionString) : base(GetOptions(connectionString)) { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        try
        {
            // modelBuilder.ComplexType<MinMax>();      // ComplexType not recognised
            base.OnModelCreating(modelBuilder);
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debugger.Break();
        }
    }

}

и, наконец, простой статический класс для его вызова (я включил его в большую программу ... чтобы дублировать эту проблему, вы можете просто вставить строки кода в program.cs):

public static class TryMe
{
    public static void MakeMeFail()
    {
        using (var db = new EFDB("FileName=C:\\temp\\test_effail.db"))
        {
            try
            {
                db.Database.EnsureCreated();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debugger.Break();   // If we hit this line, it fell over
            }
        }
        System.Diagnostics.Debugger.Break();   // If we hit this line, it worked.
    }
}

Просто позвоните TryMe.MakeMeFail(), код завершится ошибкой db.Database.EnsureCreated().

Из всего, что я прочитал, [ComplexType] должен делать то, что я хочу ... ноЭто просто не так.Также я не могу найти modelBuilder.ComplexType<T> где-либо.

Это может быть просто ссылка на библиотеку, которую мне не хватает ...?В приведенном выше коде используется следующее:

using System;
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

Однако ни в одной документации / примерах, которые я могу найти, нигде не указано, на какие библиотеки нужно ссылаться!

Заранее спасибо.

[PS: извинения тем, кто уже видел этот вопрос, я использую EF Core 2.0, а не EF6]

1 Ответ

0 голосов
/ 28 мая 2018

Типично ... это всегда так, не так ли?Через 5 минут после публикации вы найдете ответ на свой вопрос ...

Ответ, в данном случае, можно найти здесь:

https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities

EF Core называет этот тип сущности «принадлежащей» сущностью, а не «сложным типом».

Простое добавление этих строк в OnModelCreating решило проблему:

modelBuilder.Entity<Pump>().OwnsOne(p => p.normalCurrent);
modelBuilder.Entity<Pump>().OwnsOne(p => p.normalFlowRate);

База данныхсейчас создает (правильно, я думаю, я еще этого не проверял).

...