Entity framework EF核心组合类到同一个表中
我一直在到处搜索并阅读文档,但似乎找不到与我类似的场景 情况如下。 在C#中,我有3门课: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
[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直接回答我的问题:(