0

我正在尝试从数据库中设置检索。我有一个 EF(实体框架)对象emUser和一个User从 emUser 继承的普通类,但添加了一些额外的功能。

public class User : emUser
{
    #region Properties
    public string Username
    {
        get { return Email; }
    }
    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }
    #endregion
}

public partial class emUser : EntityObject
{
    [code ...]
}

出于某种原因,尽管 User 从 emUser 继承,但我无法显式转换它们。我正在使用的代码:

List<User> returnUsers = new List<User>();
var users =
    (from u in edm.UserSet.OfType<emUser>()
    select u);

    if (users != null)
    {
        foreach (emUser user in users)
        {
            User newUser = (User)user;
            returnUsers.Add(newUser);
        }
    }
return returnUsers;

我可以User为 emUser 制作一个包装器,但是每次对 emUser 进行更改时,我都必须更改它。我想用来User区分技术服务层和领域层中使用的类。

我收到这样的错误消息:

{System.InvalidCastException: Unable to cast object of type 'Services.emUser' to type 'Users.User'. at Services.DatabaseController.GetUsers() in [file path]:line 412}

为什么我不能将 emUser 转换为 User?

4

2 回答 2

0

您的问题是@millimoose 所说的:EF 只能返回emUser对象,因为它不知道User并且 anemUser可能不是 a User

您可以从这里获得三种可能的解决方案:

  1. 设置User为继承自EntityObject,然后emUser继承自User。这将是一个痛苦的实现,并没有给你任何有用的优势。
  2. 创建要传递的数据传输对象,您基本上将所有属性从 a 复制emUser到 a 中User(通常通过User的构造函数)。这会给你想要的分离,但会很痛苦。
  3. 将额外的属性添加partialemUser. 这是我强烈推荐的,因为它简单明了。

这是一个例子:

// In a manually generated file in the same project
public partial class emUser
{
    #region Properties
    public string Username
    {
        get { return Email; }
    }
    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }
    #endregion
}

// In the automatically generated file
public partial class emUser : EntityObject
{
    [code ...]
}

用法:

emUser foo = GetUser();
Console.WriteLine("FirstName: " + emUser.FirstName);
Console.WriteLine("FullName: " + emUser.FullName);
于 2012-11-19T17:50:33.597 回答
0

除非添加转换运算符,否则不能将基类转换为派生类。

public class User : emUser
{
    #region Properties
    public string Username
    {
        get { return Email; }
    }
    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }
    #endregion

    public static explicit operator User (emUser user) 
    {
        User result = new User();
        // set properties
        return result;
    }
}
于 2012-11-19T18:07:45.260 回答