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!