【问题标题】:How do I only Insert columns that are in my viewModel using entity framework?如何仅使用实体框架插入视图模型中的列?
【发布时间】:2014-11-30 06:00:02
【问题描述】:

我正在尝试使用 ASP.NET MVC 和 ViewModel 中的实体框架将新记录插入到数据库表中。我希望生成的 INSERT SQL 语句仅包含视图模型中的列,而不是域模型中的每一列。这是我正在使用的测试代码。

我的ViewModel 班级

public class ViewModel1
{
    public string column1 {get; set;}
    public string column2 { get; set; }
}

我的领域模型类

public partial class Entity1Table
{
    public int ID { get; set; }
    public string column1 { get; set; }
    public string column2 { get; set; }
    public string column3 { get; set; }
}

我在其中插入数据的控制器操作。我将使用视图填充数据,但为了简单起见,我在此处手动填充 ViewModel 类。

public ActionResult Index()
{
   //db is my data context
   Mapper.CreateMap<ViewModel1,Entity1Table>().ReverseMap();
   var myViewModel = new ViewModel1 { column1 = "testData1", column2 = "testData2" };
   var InsertThis = Mapper.Map<ViewModel1, Entity1Table>(myViewModel);

   db.Entity1Table.Add(InsertThis);
   db.SaveChanges();
   return View();
}

当我查看从这段代码生成的 SQL 时,它看起来像这样:

INSERT [dbo].[Entity1Table]([column1], [column2], [column3])
VALUES (@0, @1, NULL)
SELECT [ID]
FROM [dbo].[Entity1Table]
WHERE @@ROWCOUNT > 0 AND [ID] = scope_identity()

-- @0: 'testData1' (Type = AnsiString, Size = 30)
-- @1: 'testData2' (Type = AnsiString, Size = 30)
-- Executing at 11/29/2014 11:38:17 PM -06:00
-- Completed in 45 ms with result: SqlDataReader

正如您在此处看到的,Entity Framework 将NULL 插入到 column3 中,即使没有参数,因为它是模型的一部分。我有数百列的表,我不想插入所有这些 NULL,因为我希望能够在数据库中使用默认值,并且我希望我的 INSERTS 在没有额外 NULL 的情况下看起来更干净。

这可以用实体框架完成吗?

【问题讨论】:

  • 数据库中的默认值是多少?为什么null 不合适,你什么都没有输入?
  • 既然 EF 正在插入一个新行,那么它应该插入什么?如果您在创建新行时未指定值并且该列可以为空,那么数据库会将其保留为空,因此没有区别......无论如何,EF 总是为所有列插入值,我能想到的唯一改变方法是将是创建您自己的拦截器,但这会非常复杂并且不会给您带来明显的好处。
  • 好的。谢谢你。很高兴知道。必须将数百个 NULLS 插入一个非常宽的表中似乎很奇怪。我想也许有一种方法可以只插入具有参数的列。 @StephenMuecke 是的,数据是正确的,但我不确定如果我在数据库中有默认绑定会发生什么。

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


【解决方案1】:

如果您要使用关系数据库,那么您可以对不想插入的属性使用 Null 或 Default 值。

【讨论】:

    【解决方案2】:

    如果您的数据列有一些默认值,并且您尝试仅插入有限的列,而不是默认值插入到您的 sql 表中。 EF不会影响Sql设置的默认值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 2016-02-19
      • 1970-01-01
      相关资源
      最近更新 更多