如何在 Entity Framework Core 2/C# 中实现简单的“复杂类型”?

我第一次使用 Entity Framework 和 .Net Core 2.0(我对 C# 也很陌生,但我从版本 1 开始就一直在使用传统的 .Net Framework 和 VB ......所以我不是新手到 .Net 开发),并且我已经遇到了创建数据库的问题。


以这个简单的场景为例:我想存储一些关于一些电动泵的信息。其中两个属性是最小/最大类型范围,因此我将它们实现为一个简单的类,因此:


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>任何地方。

江户川乱折腾
浏览 109回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP