Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF核心组合类到同一个表中_Entity Framework_.net Core - Fatal编程技术网

Entity framework EF核心组合类到同一个表中

Entity framework EF核心组合类到同一个表中,entity-framework,.net-core,Entity Framework,.net Core,我一直在到处搜索并阅读文档,但似乎找不到与我类似的场景 情况如下。 在C#中,我有3门课: [Table("my_baseline_table")] class Baseline { public Guid Id { get; set; } public ClassA ClassA { get; set; } public ClassB ClassB { get; set; } } class ClassA { public string Prope

我一直在到处搜索并阅读文档,但似乎找不到与我类似的场景

情况如下。 在C#中,我有3门课:

[Table("my_baseline_table")]
class Baseline
{
   public Guid Id { get; set; }
   public ClassA ClassA { get; set; }
   public ClassB ClassB { get; set; }
}

class ClassA
{
   public string Property1 { get; set; }
   public string Property2 { get; set; }
   public string Property3 { get; set; }
}

class ClassB
{
   public string Property4 { get; set; }
   public string Property5 { get; set; }
   public string Property6 { get; set; }
}

我的类“ClassA”和“ClassB”实际上有更多的属性,每个属性大约12个,只是尽量保持简单

然后在SQL上,我有一个包含所有列的表:

dbo.my_baseline_table
   id
   property1
   property2
   property3
   property4
   property5
   property6
现在我不知道如何告诉EF这种关系。 因此,它开始抱怨“A类”需要一个id等等

我之所以将这些属性分为两个类,是因为这样可以更轻松地基于它创建一些JSON文件,而不必单独选择每个属性

有人知道这是如何实现的,或者有其他建议来完成这项工作吗


谢谢。

实体应该反映表结构。生成Json是一个独立的问题,我建议声明一个适用于此目的的DTO结构,并将实体投影到可以序列化为Json的DTO结构中。Automapper非常适合这样的操作,它提供了一种集成到EF的Linq实现中以生成查询的
ProjectTo
方法

// Entity
public class Baseline
{
   public Guid Id { get; set; }
   public string Property1 { get; set; }
   // et. al.
}

// DTOs
[Serializable]
public class BaselineDTO
{ 
    public Guid Id { get; set; }
    public ClassADTO ClassA { get; set; }
    public ClassBDTO ClassB { get; set; }
}

[Serializable]
class ClassADTO
{
   public string Property1 { get; set; }
   public string Property2 { get; set; }
   public string Property3 { get; set; }
}

[Serializable]
class ClassBDTO
{
   public string Property4 { get; set; }
   public string Property5 { get; set; }
   public string Property6 { get; set; }
}
然后,当您要读取数据以序列化为JSON时:

var config = new MapperConfiguration(cfg => 
{
    cfg.CreateMap<Baseline, BaselineDTO>()
       .ForMember(dest => dest.ClassA, opt => opt.MapFrom(src => src))
       .ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src));
    cfg.CreateMap<BaseLine, ClassADTO>();
    cfg.CreateMap<BaseLine, ClassBDTO>();
});

var baselines = context.Baselines
    .Where(/* conditions */)
    .ProjectTo<BaselineDTO>(config)
    .ToList();
var config=new-MapperConfiguration(cfg=>
{
cfg.CreateMap()
.ForMember(dest=>dest.ClassA,opt=>opt.MapFrom(src=>src))
.ForMember(dest=>dest.ClassB,opt=>opt.MapFrom(src=>src));
CreateMap();
CreateMap();
});
var baselines=context.baselines
.其中(/*条件*/)
.ProjectTo(配置)
.ToList();

这将为您提供所需的序列化为JSON的结构。将同一个源(实体)映射到三个DTO看起来有点奇怪,但如果实体和DTO之间的属性名称一致,Automapper将计算出要跨其复制的值。

实体应反映表结构。生成Json是一个独立的问题,我建议声明一个适用于此目的的DTO结构,并将实体投影到可以序列化为Json的DTO结构中。Automapper非常适合这样的操作,它提供了一种集成到EF的Linq实现中以生成查询的
ProjectTo
方法

// Entity
public class Baseline
{
   public Guid Id { get; set; }
   public string Property1 { get; set; }
   // et. al.
}

// DTOs
[Serializable]
public class BaselineDTO
{ 
    public Guid Id { get; set; }
    public ClassADTO ClassA { get; set; }
    public ClassBDTO ClassB { get; set; }
}

[Serializable]
class ClassADTO
{
   public string Property1 { get; set; }
   public string Property2 { get; set; }
   public string Property3 { get; set; }
}

[Serializable]
class ClassBDTO
{
   public string Property4 { get; set; }
   public string Property5 { get; set; }
   public string Property6 { get; set; }
}
然后,当您要读取数据以序列化为JSON时:

var config = new MapperConfiguration(cfg => 
{
    cfg.CreateMap<Baseline, BaselineDTO>()
       .ForMember(dest => dest.ClassA, opt => opt.MapFrom(src => src))
       .ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src));
    cfg.CreateMap<BaseLine, ClassADTO>();
    cfg.CreateMap<BaseLine, ClassBDTO>();
});

var baselines = context.Baselines
    .Where(/* conditions */)
    .ProjectTo<BaselineDTO>(config)
    .ToList();
var config=new-MapperConfiguration(cfg=>
{
cfg.CreateMap()
.ForMember(dest=>dest.ClassA,opt=>opt.MapFrom(src=>src))
.ForMember(dest=>dest.ClassB,opt=>opt.MapFrom(src=>src));
CreateMap();
CreateMap();
});
var baselines=context.baselines
.其中(/*条件*/)
.ProjectTo(配置)
.ToList();

这将为您提供所需的序列化为JSON的结构。将同一个源(实体)映射到三个DTO看起来有点奇怪,但前提是实体和DTO之间的属性名称一致,Automapper将计算出要跨其复制的值。

您要查找的称为“”。例如这个

[Table("my_baseline_table")]
class Baseline
{
    public Guid Id { get; set; }
    public ClassA ClassA { get; set; }
    public ClassB ClassB { get; set; }
}

[Owned]
class ClassA
{
    [Column(nameof(ClassA.Property1))]
    public string Property1 { get; set; }

    [Column(nameof(ClassA.Property2))]
    public string Property2 { get; set; }

    [Column(nameof(ClassA.Property3))]
    public string Property3 { get; set; }
}

[Owned]
class ClassB
{
    [Column(nameof(ClassB.Property4))]
    public string Property4 { get; set; }

    [Column(nameof(ClassB.Property5))]
    public string Property5 { get; set; }

    [Column(nameof(ClassB.Property6))]
    public string Property6 { get; set; }
}
映射到

  CREATE TABLE [my_baseline_table] (
      [Id] uniqueidentifier NOT NULL,
      [Property1] nvarchar(max) NULL,
      [Property2] nvarchar(max) NULL,
      [Property3] nvarchar(max) NULL,
      [Property4] nvarchar(max) NULL,
      [Property5] nvarchar(max) NULL,
      [Property6] nvarchar(max) NULL,
      CONSTRAINT [PK_my_baseline_table] PRIMARY KEY ([Id])
  );

你要找的东西叫做“”。例如这个

[Table("my_baseline_table")]
class Baseline
{
    public Guid Id { get; set; }
    public ClassA ClassA { get; set; }
    public ClassB ClassB { get; set; }
}

[Owned]
class ClassA
{
    [Column(nameof(ClassA.Property1))]
    public string Property1 { get; set; }

    [Column(nameof(ClassA.Property2))]
    public string Property2 { get; set; }

    [Column(nameof(ClassA.Property3))]
    public string Property3 { get; set; }
}

[Owned]
class ClassB
{
    [Column(nameof(ClassB.Property4))]
    public string Property4 { get; set; }

    [Column(nameof(ClassB.Property5))]
    public string Property5 { get; set; }

    [Column(nameof(ClassB.Property6))]
    public string Property6 { get; set; }
}
映射到

  CREATE TABLE [my_baseline_table] (
      [Id] uniqueidentifier NOT NULL,
      [Property1] nvarchar(max) NULL,
      [Property2] nvarchar(max) NULL,
      [Property3] nvarchar(max) NULL,
      [Property4] nvarchar(max) NULL,
      [Property5] nvarchar(max) NULL,
      [Property6] nvarchar(max) NULL,
      CONSTRAINT [PK_my_baseline_table] PRIMARY KEY ([Id])
  );

太简单了D谢谢你。将此标记为一个答案,因为它直接回答了问题,并且有效。然而,在进一步思考之后,我决定同意Steve Py的建议,使用多个DTO,这将为我的用例提供更大的长期灵活性。太简单了!:D谢谢你。将此标记为一个答案,因为它直接回答了问题,并且有效。然而,在进一步思考之后,我决定同意Steve Py的建议,即使用多个DTO,这将为我的用例提供更大的长期灵活性。非常感谢。我必须同意你的建议,我已经决定改变我的实施,以符合你的建议。这种方式将简化DB映射,并允许我为API的不同用例使用DTO。不幸的是,我只能在StackOverflow中选择一个答案,因此我不得不选择David Browne,因为它直接回答了我的问题:(非常感谢您。我不得不同意您的建议,我决定更改我的实现以符合您的建议。这种方式将简化DB映射,并允许我为API的不同用例使用DTO。不幸的是,我只能在StackOverflow中选择一个答案,因此我必须像我一样选择David Brownet直接回答我的问题:(