gpt4 book ai didi

c# - 扩展 DataContext 实体 - 在 "child"类中使用 InsertOnSubmit(this)

转载 作者:行者123 更新时间:2023-12-03 22:56:22 26 4
gpt4 key购买 nike

我正在扩展这个 DataContext 实体,它看起来有点像这样:

namespace Entities
{
public class User
{
public Int32 Id { get; set; }
public String Username { get; set; }
}
}

..像这样:

public class User : Entities.User
{
new public Int32 Id
{
get { return base.Id; }
}


public void Insert()
{
using (var dc = new DataContext())
{
/*
The "this" keyword should match the type that InsertOnSubmit() expects.
And it does. But I get the following error:

System.NullReferenceException: {"Object reference not set to an instance
of an object."}
*/
dc.Users.InsertOnSubmit(this); // Exception occurs here

dc.SubmitChanges();
}
}
}

我正在使用自定义用户类,如下所示:

var u = new User { Username = "Test" };

u.Insert();

我不明白的是:我已经实例化了该类,那么为什么我会收到 NullReferenceException?


更新:


扩展实体类:使用枚举器覆盖属性,同时仍然能够在 Insert/UpdateDeleteOnSubmit 上使用“this”关键字DataContext 实例上的 code> 方法

enum AccessLevels
{
Basic,
Administrator
}


namespace Entities
{
public class User
{
public Int32 Id { get; set; }
public String Username { get; set; }
public Int32 AccessLevel { get; set; }
}
}

我如何扩展或更改上述实体类并实现 AcessLevels 枚举器,替换 AccessLevel 属性? - 这不会更改实体类的签名,因此我可以在 DataContext 的 Insert/UpdateDeleteOnSubmit 方法上使用“this”关键字。

最佳答案

您无法通过继承以这种方式扩展 LINQ-to-SQL 实体类型 - 您应该使用部分类现有生成的实体类型添加额外的方法实体。由于 LINQ-to-SQL 支持继承(对于可区分的表等),因此它期望与已知实体类型完全匹配 - 而不是意外的子类。

namespace Entities {
partial class User {
/* your extra method(s) here */
}
}

在上面,这是与 Designer.cs 中的分部类相结合来创建类型的。

执行此操作的另一种方法(如果分部类不是一个选项)是通过扩展方法。

static class EntityExtensions {
public static void SomeMethod(this User user) {...}
}

如果类型之间存在通用方法,则可以通过声明接口(interface)、在该接口(interface)上使用扩展方法以及使用分部类将接口(interface)添加到特定类型来实现此目的:

namespace Entities {
partial class User : IFunkyInterface {
/* interface implementation, if necessary */
}
}

static class EntityExtensions {
public static void SomeMethod(this IFunkyInterface obj)
{...}
}

或者如果您需要知道类型:

static class EntityExtensions {
public static void SomeMethod<T>(this T obj)
where T : class, IFunkyInterface
{...}
}

关于c# - 扩展 DataContext 实体 - 在 "child"类中使用 InsertOnSubmit(this),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/818299/

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