I found this something interesting while wandering over community which I would like
to share. The post is whole about: DBML is not considering the table
field's "Default value or Binding" setting which is a NotNull. I mean the
field which can not be null but having default value set needs
to be set IsDbGenerated = true in DBML file explicitly.Consider this situation: There is a simple tblEmployee table with below structure: The fields are simple. EmployeeID is a Primary Key with Identity Specification = True with Identity Seed = 1
to autogenerate numeric value for this
field. EmployeeName and their EmailAddress
to store in rest of 2 fields. And the last one is "DateAdded" with DateTime datatype which doesn't allow NULL but having Default Value/Binding with "GetDate()". That means if we don't pass any value
to this
field then SQL will insert current date in "DateAdded"
field.So, I start with a new website, add a DBML file and dropped the said table
to generate LINQ
To SQL context class. Finally, I write a simple code snippet
to insert data into the tblEmployee table; BUT, I am not passing any value
to "DateAdded"
field. Because I am considering SQL Server's "Default Value or Binding (GetDate())" setting
to this
field and understand that SQL will insert current date
to this
field. using (TestDatabaseDataContext context = new TestDatabaseDataContext()) { tblEmployee tblEmpObjet = new tblEmployee(); tblEmpObjet.EmployeeName = "KaushaL"; tblEmpObjet.EmployeeEmailAddress = "
[email protected]"; context.tblEmployees.InsertOnSubmit(tblEmpObjet); context.SubmitChanges(); }Here comes the twist when application give me below error: This is something not expecting! From the error it clearly depicts that LINQ is passing NULL value
to "DateAdded"
Field while according
to my understanding it should respect Sql Server's "Default value or Binding" setting for this
field. A bit googling and I found very interesting related
to this problem.When we set Primary Key
to any
field with "Identity Specification" Property set
to true; DBML set one important property "IsDbGenerated=true" for this
field. BUT, when we set "Default Value or Biding" property for some field; we need
to explicitly tell the DBML/LINQ
to let it know that this
field is having default binding at DB side that needs
to be respected if I don't pass any value. So, the solution is: You need
to explicitly set "IsDbGenerated=true" for such
field to tell the LINQ that the
field is having default value or binding at Sql Server side so, please don't worry if i don't pass any value for it.You can select the
field and set this property from property window in DBML Designer file or write the property in DBML.Designer.cs file directly. I have attached a working example with required table script with this post here. I hope this would be helpful for someone hunting for the same. Happy Discovery!