0

データベースからの取得を設定しようとしています。EF(Entity Framework)オブジェクトemUserと、emUserから継承する通常のクラスがありUserますが、いくつかの機能が追加されています。

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;

emUserのラッパーを作成することはできUserますが、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

変換演算子を追加しない限り、基本クラスを派生クラスに変換することはできません。

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 に答える
0

ここでの問題は、@millimoose が言ったことです: EF はオブジェクトのみを返すことがemUserできます。 UseremUserUser

ここから 3 つの解決策が考えられます。

  1. から継承するように設定しUserてからEntityObject、からemUser継承しUserます。これは実装するのが面倒で、有益な利点はありません。
  2. 基本的にすべてのプロパティを からemUserUser(通常はUserのコンストラクターを介して) コピーします。これにより、必要な分離が得られますが、面倒です。
  3. partialの新しいクラスに追加のプロパティを追加しemUserます。シンプルで分かりやすいのでオススメです。

次に例を示します。

// 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 に答える