I have this code:
using DC = MV6DataContext;
using MV6; // Business Logic Layer
// ...
public DC.MV6DataContext dc = new DC.MV6DataContext(ConnectionString)
Actually it's better to add a call to your constructor that also calls the generic constructor such as:
public IP(string address) : this() {
...
}
Is this a designer generated DataContext or your own hand-built one. I suspicious that the IPs table may not be instantiated at the time you try your InsertOnSubmit()
. I can't see how this would happen with a designer-generated DataContext, but I've been known to forget to initialize my collections from time to time in my own code.
You can try to see what's happening, what changes will be done, if you place a breakpoint just before SubmitChanges, and do a quick watch of dc.GetChangeSet().
Got it.
Rather than creating a class that inherits from the DataContext's class, I extend the DC class itself with a partial class in the Business Logic layer. From there I can add whatever constructors and methods I wish.
In this case, it is neccessary to copy the code from the existing (auto-generated) constructor:
public IP(string address) {
Address = address;
Domain = "";
Notes = "";
FirstAccess = DateTime.Now;
LastAccess = DateTime.Now;
this._Sessions = new EntitySet<Session>(new Action<Session>(this.attach_Sessions), new Action<Session>(this.detach_Sessions));
OnCreated(); }
Not sure what's in that OnCreated handler, but it seems to be doing the work that boned me earlier. Works fine now :)
I had a slightly different situation than the asker, but got the same error for the same reasons. I wrote new constructors in a partial class for my database entities, then tried to use the resulting objects in InsertOnSubmit
calls.
None of these answers helped me directly, but I was able to figure out what they were getting at after reading all of them.
The auto-generated parameterless constructor for the entity does things that need to happen for InsertOnSubmit
to work, so if you overload the constructor -- like me -- or inherit from the class -- like the asker -- you need to call the base constructor from your new constructor, like so:
public partial class Entity {
public Entity( Type parameter ) : this() {
// do things with the parameter
}
}
or
public class SubEntity: Entity {
public SubEntity( Type parameter ) : base() {
// do things with the parameter
}
}
Since the default constructor already initializes base(), this._Sessions and runs the OnCreated method, all you need to do in your extended constructor is this:
public IP(string address) : this()
{
Address = address;
Domain = "";
Notes = "";
FirstAccess = DateTime.Now;
LastAccess = DateTime.Now;
}