派生自动生成的实体类

时间:2012-03-10 06:17:52

标签: c# .net entity-framework

我有一个edmx文件被设置为Code Generation StrategyNone,并且设置了一个T4模板,我删除了工厂方法创建逻辑。我已经通过部分类为单独的文件中的少数实体引入了一些额外的方法。

Ex:我在部分类中为实体User引入了一些方法,我从Admin派生了类PersonUser,我想在其中介绍其他一些方法。

我在这里遇到的问题是,在为Admin的导航属性赋值时,会抛出异常Object mapping could not be found for Type with identity 'CivilRegistry.ControlledModel.Admin'.

用户类:

public partial class User
{

    protected static UserRepository repository = new UserRepository();

    public User Insert(User user)
    {
        user.AddedDate = DateTime.Now;
        user.AddedUserId = this.UserId;
        return repository.Insert(user);
    }
    //
    //Other methods goes here.
    //
}

管理员类:

public class Admin : User
{
    public Admin() { }

    private Admin(User user)
    {
        this.UserName = user.UserName;
        //
        //Other properties
        //
        this.AddedUser = user.AddedUser; //This line throws, Exception.
    }

    public static Admin FindBy(int id)
    {
        //repository.FindByID returns an instance of User entity.
        return new Admin(repository.FindByID(user => user.UserId == id && user.RoleId == (int)RoleEnum.Admin));
    }
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

不支持。您无法在EDMX中定义实体,然后从代码中的实体派生其他类。以这种方式创建的派生类不再是实体,并且不能被EF检索或持久化,因为EF不再知道如何映射它们。

分配导航属性失败的原因是EF知道AdminUser并且它尝试将其附加到上下文但是却找不到Admin类型在映射(EDMX)。

解决方案是将继承映射=将继承移动到EDMX,您将在其中定义User实体和派生的PersonAdmin实体。 Here你有一些教程。