C#类构造函数将值赋给'this'

3

我有一个“天真”的问题。

以下是示例代码:

public class ThisClass
{
    public int ThisClassID { get; set; }
    public string ThisValue { get; set;}

    public ThisClass()
    {
    }

    public ThisClass(int thisClassID)
    {
        using (MyContext dbContext = new MyContext())
        {
            this = dbContext.CaseNotes.Find(thisClassID);
        }
    }
}

当然,我收到了错误信息“Cannot assign to 'this' because it is read-only”。
我所知道的解决方法只有两种,一种是使用静态方法,另一种是分别对每个属性进行赋值。
是否有任何方法可以创建一个简单的构造函数来将数据库实体返回到“this”中?
更新:下面的两个答案都是正确的,但我只能接受一个答案。当潜在答案被删除时,有一些关于工厂和存储库模式的有趣讨论不幸被删除了。双方的观点都有些道理,有些人指出Entity Framework本身就是一个使用存储库模式的工厂。问题本身得到了三个赞成和两个反对的投票。
答案似乎是没有单一的答案。

你的 MyContext 已经返回 ThisClass 实例了,对吧?... 为什么还要再复制一遍呢? - Random Dev
这只是一个样例,不是真实世界中的例子。它并不打算工作!我正在寻找创建对象的通用解决方案。持久性不是问题! - Peter Smith
1
-1 不是我发的...并不是每个评论都与踩有关 - 实际上在 C# 部分,人们很少在意踩的同时留下评论。 - Random Dev
4
通用解决方案是创建一个工厂类,通过工厂实例化ThisClass的对象,而不是使用构造函数。 - Maksim Simkin
2
在99.9%的情况下,工厂是不必要的抽象 - 实际上,在现代代码中很少看到工厂,除了旧的MS东西之外:P - Random Dev
2个回答

3

您应该查看 AutoMapper,您的代码可能如下所示:

// Somewhere in your application/service initialization class and in some method...
Mapper.CreateMap<ThisClass, ThisClass>();

public class ThisClass
{
    public int ThisClassID { get; set; }
    public string ThisValue { get; set;}

    public ThisClass()
    {
    }

    public ThisClass(int thisClassID)
    {
        using (MyContext dbContext = new MyContext())
        {
            Mapper.Map(dbContext.CaseNotes.Find(thisClassID), this);
        }
    }
}

顺便说一下,这听起来像是个不好的主意。我不会在它自己的构造函数中填充域对象。

对于存储库来说,这是一个好的责任。


2

有没有办法创建一个简单的构造函数来返回数据库实体?

实际上不行。在理论上,您可以将类型设置为struct。然后,代码应该编译。您可以在结构体中对其进行赋值。

可能,您根本不应该使用构造函数。创建一个工厂方法,它只需返回Find的结果即可。

关于构造函数的一个不可改变的事实是它们每次都会创建一个新对象。我认为你不想在这里这样做。您可能希望保留现有的对象实例及其标识。


1
使用结构体作为数据库实体听起来像是灾难的预谋... 它会很快地耗尽内存。就像你所说的那样,工厂方法应该是更好的方式,理想情况下应该在内部使用仓储模式。 - hbulens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接