gpt4 book ai didi

c# - 使用 Entity Framework 向下转型

转载 作者:行者123 更新时间:2023-11-30 14:38:51 25 4
gpt4 key购买 nike

我有一个项目,我在 EF 中定义了一个 Employer作为 User 的派生类.在我的过程中,我创建了一个用户,但不知道它最终是否会成为雇主(或其他类型的用户),稍后我需要转换它。起初我尝试了(Intellisense 指示存在显式转换):

Employer e = (Employer) GetUser();

但在运行时我得到:

Unable to cast object of type 'System.Data.Entity.DynamicProxies.User_7B...0D' to type 'Employer'.

所以我试着写了一个转换器:

public partial class User
{
public static explicit operator Employer(User u)
{

但是我得到了错误:

Error   21  'User.explicit operator Employer(User)': user-defined
conversions to or from a derived class are not allowed
C:\Users\..\Documents\Visual Studio 2010\Projects\..\Website\Models\EF.Custom.cs

很好。然后我重载了 Employer 的构造函数像这样:

public partial class Employer
{
public Employer(User u)
{
this.Id = u.Id;
this.Claims = u.Claims;
// etc.
}
}

然后我想我可以这样做:

Employer e = new Employer(GetUser());

但是当我运行它时出现错误:

System.InvalidOperationException was unhandled by user code
Message=Conflicting changes to the role 'User' of the
relationship 'EF.ClaimUser' have been detected.
Source=System.Data.Entity
StackTrace:
[...]
at Controllers.AuthController.Register(String Company, String GivenName,
String Surname, String Title, String Department) in C:\Users\..\Documents\
Visual Studio 2010\Projects\..\Website\Controllers\AuthController.cs:line

作为最后的手段,我试着写这个:

        Employer e = Auth.Claims("id")
.Where(x => x.Value == Auth.NameIdentifier())
.Select(x => x.User)
.Cast<Employer>()
.Single();

... GetUser() 返回类型为 User 的对象不提供 .Cast<>所以我使用直接查询到达那里......但我仍然得到动态代理对象异常的转换。

所以我的问题是:当对象通过 EF 具有持久性时,我该如何向下转换?

最佳答案

这是不可能的。您必须始终使用最终类型。一旦您将其创建为 User,EF 将永远不允许您将其更改为派生实体类型。

顺便说一句。面向对象的方法也是不可能的。您不能将父类的实例转换为派生类的实例(除非它确实是派生类的实例)——它会在运行时抛出异常。重现问题的非常简单的示例:

class X { } 

class Y : X { }

class Program
{
static void Main(string[] args)
{
X x1 = new Y();
Y y1 = (Y)x1; // Works

X x2 = new X();
Y y2 = (Y)x2; // InvalidCastException
}
}

唯一的方法是覆盖转换运算符,它将在内部创建派生类的新实例并将所有字段从旧父实例复制到新的派生实例。

Entity Framework 需要完全相同的方法。如果您从 User 实体开始,现在您想将其提升为 Employer 实体,您必须删除旧用户并创建新的 Employer

关于c# - 使用 Entity Framework 向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7266848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com