繁体   English   中英

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

[英]How do I implement a simple “complex type” in 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>

它可能只是我缺少的图书馆参考......? 上面的代码使用以下代码:

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

但是,我可以在任何地方找到的文档/示例中没有一个显示哪些库需要引用!

提前致谢。

[PS:向那些已经看过这个问题的人致歉,我使用的是EF Core 2.0,而不是EF6]

典型......总是这样,不是吗? 发布后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);

数据库现在创建(正确地,我认为,我尚未验证)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM