【发布时间】:2020-12-30 04:39:21
【问题描述】:
我需要知道是否可以使用 Automapper 从数据库视图映射 DTO 属性。或者也许在 DbContext 模型配置中是可能的。让我们想象一下,我有一个业务目的是拥有一个包含其他相关数据的视图,但为了简洁起见,我将类变得简单
相关的Nugets
- EF Core v3.1.7
- AutoMapper v10.0.0
我有一个实体
public class Foo {
public int Id { get; set; }
public string Name { get; set; }
}
我有一个无钥匙视图
public class BarVW {
public int FooId { get; set; }
public string FooName { get; set; }
}
视图构建在 DB Initializer 类中
context.Database.ExecuteSqlRaw(
@"CREATE OR REPLACE VIEW v_Bar AS
select
f.Id as FooId,
f.[Name] as FooName
from
Foo f
-- where some logic that makes a Foo appear in view"
);
然后将视图分配给DbContext类中的一个DbSet
modelBuilder.Entity<BarVW>(eb =>
{
eb.HasNoKey();
eb.ToView("v_Bar");
});
public DbSet<BarVW> BarVW { get; set; }
在我的 FooDto 中,我需要一个附加属性到我的实体类,这将表明这个 Foo 存在于我的数据库视图 v_Bar 中
public class FooDto {
public int Id { get; set; }
public string Name { get; set; }
public bool IsBar { get; set; }
}
对于 Automapper 配置,我有以下内容,但我不知道我可以从 BarVW DbSet 映射我的 dto IsBar 属性
CreateMap<Foo, FooDto>()
.ForMember(dto => dto.IsBar, opt => ??? ); // don't know what to put here
【问题讨论】:
-
将
IsBar添加到Foo并将其设置在那里。这不是映射问题。 -
@LucianBargaoanu
IsBar不是数据库属性(列)。IsBar是一个业务逻辑属性,其结果由 View 中存在的 FooId 确定 -
这是一个数据库问题。它属于你自己的代码,而不是 AM 配置。
-
您可以使用
BeforeMap或AfterMap吗?什么决定了IsBar是否为真?如果实体不为空,是真的吗? -
@LucianBargaoanu 不,这不是数据库问题。视图不能具有可导航属性,因此我无法在
Foo类中引用视图。所以我的问题仍然是,如何将 View 的结果映射到 Dto 上的属性?
标签: c# sql-server entity-framework-core automapper