当前位置: 首页 > 编程语言 > C#

实体框架为默认值在db中定义的NOTNULL列生成值share

时间:2023-04-10 16:43:27 C#

实体框架为默认值在db中定义的NOTNULL列生成值嗨,我有一桌顾客。表中的一列是DateCreated。此列不是NULL,但在数据库中为该列定义了一个默认值。当我使用EF4从我的代码中添加新客户时。varcustomer=newCustomer();customer.CustomerName="你好";customer.Email="hello@ello.com";//注意注释掉了。//customer.DateCreated=DateTime.Now;context.AddToCustomers(客户);context.SaveChanges();上面的代码生成以下查询。execsp_executesqlN'insert[dbo].[Customers]([CustomerName],[Email],[Phone],[DateCreated],[DateUpdated])值(@0,@1,null,@2,null)选择[CustomerId]from[dbo].[Customers]where@@ROWCOUNT>0and[CustomerId]=scope_identity()',N'@0varchar(100),@1varchar(100),@2datetime2(7)',@0='Hello',@1='hello@ello.com',@2='0001-01-0100:00:00'并抛出错误Theconversionofadatetime2datatypetoadatetimedatatype导致超出范围的值。该语句已终止。您能告诉我在数据库级别具有默认值的NOTNULL列如何不应该具有EF生成的值吗?DB:DateCreatedDATETIMENOTNULLEF中的DateCreated属性:谢谢。根据我对EF(最小)的了解,它不会从架构中获取默认值。您插入的行和列被标记为NOTNULL的事实意味着EF认为它应该为恰好具有DateTime.MinValue值的该列插入一个值。您可能需要在实体构造函数中强制执行自己的值,或者创建一些工厂方法。EF中表设计器的属性页上有没有指定默认值的东西?NOTNULL列表示该属性不可为null,并且它必须在您的实体中具有值。如果在等效的DateTime中未指定任何值,则DateTime为默认值。DateTime默认值为DateTime.MinValue。据我所知,EF不支持您可以使用NOTNULL列并且不从您的应用程序发送任何值的场景。唯一的例外是当您将属性的StoreGeneratedPattern设置为Identity或Computed时,但在这种情况下,您将无法在应用程序中设置该值。因此您可以在您的应用程序或数据库中设置该值。两者都不。你必须对ORM说,该属性是由数据库生成的。对于前面示例中的客户类中的示例,以下代码应该有效。publicclassCustomer{[Key][DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]//插入一行时数据库生成一个值。publicintCustomerId{得到;放;}publicstringCustomerName{get;放;}公共字符串电子邮件{得到;放;}publicstringPhone{get;放;}[DatabaseGenerated(DatabaseGeneratedOption.Computed)]//数据库在插入或更新行时生成一个值。公共DateTimeDateCreated{得到;放;}[DatabaseGenerated(DatabaseGeneratedOption.IComputed)]//数据库在插入或更新行时生成一个值。公共DateTimeDateUpdated{得到;放;不要忘记为主键添加[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)],出于我不知道的原因,当您在模型类中至少使用一次DatabaseGeneratedAttribute时,您必须指定生成的选项方法。当我使用它们时,我有一个错误,因为ORM试图在查询中插入键而不是让数据库生成它们。数据库生成有三个选项你可以在这里找到数据库生成的选项也许DateCreated列是smalldatetime并且需要是datetime类型?尝试在VisualStudio或ManagementStudio中更改列类型。将DateCreated设置为null为INSERT添加触发器CREATETRIGGER[dbo]。[ItemCreated]ON[dbo]。[myTable]在插入后更新[dbo]。[myTable]SET[DateCreated]=GETDATE()WHERE[ID]IN(SELECTDISTINCT[ID]FROM[Inserted])AND[DateCreated]isNULL以上是C#学习教程:实体框架为NOTNULL生成值columns,其默认值是在db中定义的共享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: