views:

1387

answers:

1

I have two related classes which share a common interface and are both stored in the same underlying database table. However, the Entity Framework generates one common class, where I really need the two distinct classes. How do I resolve this? Is it best to use a base class rather than an interface? How do I change the EF model to provide two classes mapped over one table?

Edit: the AccountType property determines the type of class; user or group.

Some simple code:

public interface IAccount
{
    string Name { get; set; }
    AccountType AccountType { get; set; }
}

public class GroupAccount : IAccount
{
    public string Name { get; set; }
    public GroupType GroupType { get; set; }
    public AccountType AccountType { get; set; }
}

public class UserAccount : IAccount
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string Name { get; set; }
    public AccountType AccountType { get; set; }
}
+4  A: 

Is this data discriminated? i.e. does AccountType define which type it is? If so:

  • EF should create the Account entity from the storage
  • you then create 2 subclasses (UserAccount and GroupAccount)
  • in the mapping for Account, specify a predicate "add a condition"
    • have it map to UserAccount where the AccountType (storage) field is 1 (or whatever)
    • have it map to GroupAccount where the AccountType (storage) field is 2 (or whatever)

The account type then should completely disappear from the Account object (unmap it if not). To get just the UserAccount records, you use

 .Accounts.OfType<UserAccount>()...

The Account class should probably be abstract in this model. The interface stuff can be added via a partial class - i.e. in a separate file, define:

partial class Account : IAccount {
   // extra code here
}

etc

A reasonable walkthrough is here.

Marc Gravell
.. you answer them as quickly as i ask them, thanks ;)
flesh