I\'m trying to insert a new object into my database using LINQ to SQL but get a NullReferenceException when I call InsertOnSubmit() in the code snippet below. I\'m passing i
Try creating a base abstract class that has only properties ID and typeDiscriminator; after that create the concrete class that inherits from the base and eventually other classes that inherits from the last one. Don't include properties in derived classes that are already presents in base one.
Example: Assuming a base abstract class named BasePeoples that has properties ID and typeDiscriminator, we have a class of type Person that inherits from the base and two other classes of type Fisherman and Driver that inherits form Person.
So you'll be able to do something like this
using (DatabaseDataContext db = new DatabaseDataContext())
{
Person p = new Person();
p.FirstName = "Dario";
p.LastName = "Iacampo";
Fisherman f = new Fisherman();
f.FirstName = "San";
f.LastName = "Pei";
f.CollectedFishes = 10;
f.FishingLicenceNumber = "abc";
Driver d = new Driver();
d.FirstName = "Michael";
d.LastName = "Shumaker";
d.CarMake = "Ferrari";
d.DrivingLicenceNumber = "123abc";
db.BasePeoples.InsertOnSubmit(f);
db.BasePeoples.InsertOnSubmit(d);
db.SubmitChanges();
}
If you just want to pre-configure things, an alternative to inheritance might be:
partial class MyLinqClass {
string Text = "Default";
public MyLinqClass AsOne() {
Text = "One";
...
return this;
}
}
var x = new MyLinqClass().AsOne();
context.InsertOnSubmit(x); // x is type MyLinqClass
After doing a little research, I came to the conclusion that there's no easy way to solve this problem of submitting the inherited object directly. It's possible to Map Inheritance Hierarchies but this has nothing to do with what you pretend. You just want to submit the base
class
and don't care if it's actually a derived class
.
If you don't want to use a partial class
to add additional properties or behavior to your table class, as suggested in the thread you mentioned, I would do a simple Clone method as a workaround:
public partial class Audit
{
// ...
public Audit Concrete()
{
if (this.GetType().Equals(typeof(Audit)))
return this;
else
{
Audit audit = new Audit();
// clone properties
return audit;
}
}
}
//...
dataContext.Audits.InsertOnSubmit(audit.Concrete());