【发布时间】: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