【问题标题】:Net Core: Map Two Class Members to One Column in Entity FrameworkNet Core:将两个类成员映射到实体框架中的一列
【发布时间】:2019-09-24 23:32:55
【问题描述】:

如何将两个类成员映射到实体框架数据库中的一列?是否可以? 我尝试了以下代码并收到错误

        modelBuilder.Entity<Product>(entity =>
        {

            entity.Property(e => e.Id)
            .HasColumnName("ProductId");

            entity.Property(e => e.ProductId)
                .HasColumnName("ProductId");

错误运行时间:

“Product.Id”和“Product.ProductId”都映射到“Product”中的“ProductId”列,但配置了不同的价值生成策略。'

我们正在尝试解决这个问题,否则通用存储库将不得不使用表达式构建器

Net Core: Generic Repository Primary Id Key Performance in Entity Framework

他们的顶级解决方案不起作用。

var idName = _context.Model.FindEntityType(typeof(TEntity))
        .FindPrimaryKey().Properties.Single().Name;

【问题讨论】:

  • 听起来像一个(例如:Id)应该用[NotMapped]装饰,并有一个反映另一个属性的getter/setter。
  • hi @AlwaysLearning 询问讨论到这个链接,get;set;导致性能问题stackoverflow.com/questions/57386900/…
  • 您能否详细说明为什么您需要将 2 个属性映射到单个列,您想实现什么?只是为了确保没有XY problem
  • 嗯,我正在查看以前的代码,有些人使用 Id,其他人使用 ProductId,所以如果可能的话,需要在这两种情况下工作
  • 您是否考虑过将Id 的所有用法更改为ProductId?当它们都在同一个实例上更新时,拥有两个像这样的独立属性会给 EF 一个艰难的选择:哪个是正确的?应该坚持哪一个?消除这种可能性。

标签: c# entity-framework asp.net-core .net-core


【解决方案1】:

通用存储库是实体框架的反模式。老实说,他们不值得麻烦。

但是,要在实体中映射 ProductID 列:

entity.Property(e => e.Id)
    .HasColumnName("ProductId");
entity.Ignore(e => e.ProductId);

这里要注意的是,当您编写将通过 EF 到 SQL 的 Linq 表达式时,您需要避免使用任何被忽略的属性。

或者,我建议删除实体中的 ProductId 字段,并简单地重新标记前端代码和任何序列化程序使用的视图模型和 DTO 中的字段,设置 Automapper 以转换 ID 列。

【讨论】:

  • 嗨 Stevepy,问题是如何将两个类成员映射到一个列名,(不是 1 个类成员,而忽略另一个);我也希望能够同时使用这两个类成员,最后一部分“重新标记前端代码”是我们试图避免的问题 :),我后来被放入程序中,试图解决这个问题,但是谢谢!跨度>
  • 这个问题的答案很简单。 “你不能”。实体必须将一个属性映射到一个字段。我的观点是,如果在表具有“ProductId”时需要“Id”列的全部原因是为了实现通用存储库模式,那么解决方案就是放弃通用存储库。对于只读,您可以将实体绑定到同时选择 ProductId 和 ProductId AS Id 的视图,但是说真的,这样做有什么意义呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 2017-09-20
相关资源
最近更新 更多