C# LINQ2SQL实体构造函数约束

C# LINQ2SQL实体构造函数约束,c#,linq-to-sql,orm,C#,Linq To Sql,Orm,L2SQL使用默认的无参数构造函数生成实体。这是无法更改的,因为需要将对象具体化 但是,如果我的对象只能使用初始化的特定值创建,我将如何隐藏无参数构造函数,以便使用者只能看到带参数的构造函数 1)我可以创建另一个同名的分部类,并在其中添加新的构造函数,但消费者现在只需有两个选项来创建我的类的实例。无参数构造函数仍然可见 2)使用接口。无法创建定义构造函数的接口 人们是如何处理这个问题的,因为这看起来是一个经常发生的问题。如果我理解正确,您希望阻止该类的其他用户从无参数构造函数构造一个,但仍然允许

L2SQL使用默认的无参数构造函数生成实体。这是无法更改的,因为需要将对象具体化

但是,如果我的对象只能使用初始化的特定值创建,我将如何隐藏无参数构造函数,以便使用者只能看到带参数的构造函数

1)我可以创建另一个同名的分部类,并在其中添加新的构造函数,但消费者现在只需有两个选项来创建我的类的实例。无参数构造函数仍然可见

2)使用接口。无法创建定义构造函数的接口


人们是如何处理这个问题的,因为这看起来是一个经常发生的问题。

如果我理解正确,您希望阻止该类的其他用户从无参数构造函数构造一个,但仍然允许Linq2SQL使用它(因为它必须这样做)

幸运的是,当您说默认的无参数构造函数不能更改时,您错了。如果您将Linq2SQL实体类的构造函数更改为私有,那么它仍然会被Linq2SQL调用,因为它使用反射,如果您使用反射,则可以调用私有构造函数。(顺便提一下,对构造函数的其他更改也可以使用Linq2SQL完成)


当然,类的其他用户也可以使用反射调用私有构造函数并在私有状态中创建类,但是所有.NET类都是如此(并且确实适用于其他地方),例如,尽管不存在独立的实现方式,但通常不难篡改C++类的隐私。但是,几乎总是可以使用反射来搞乱一个类;封装是一种确保正确性而不是安全性的机制。(但是,对哪些代码可以使用反射的安全限制会在较少保证的基础上构建安全性)。

是否可以将图形ORM设计器或SqlMetal生成的默认ctor更改为private,还是需要对实体类进行手动编码?我从未使用过,所以我不知道。当然,您可以使用它们作为起点,然后手动编辑输出。缺点是您不能再次从它们重建,但是如果您使这些类对其他代码可见,那么您无论如何也不能从它们重建,因为这可能会导致中断更改,从而使其他代码无法工作。这对Jon很有效。我从未想过更改L2S生成的实体的访问修饰符,因为我认为L2S已经设置了执行底层操作所需的这些实体的访问级别。L2S生成的评论也让我不敢改变!ie//对此文件的更改可能会导致不正确的行为,如果重新生成代码,这些更改将丢失。-我能应付的再生。干杯。如果它对你有用,你能接受这个答案吗?(也要投票支持,尽管IIRC需要更多的声誉点数)。这标志着它已经解决了你的问题,并帮助有类似问题的人很快看到这是一个有用的答案,而不是一个转移注意力的问题。我编辑了我的业务/ORM程序集,并将一个示例客户实体的构造函数标记为private,然后将一个带有参数的公共构造函数添加到另一个同名的分部类(单独的业务逻辑)。但是,一旦我的表示层使用了业务/ORM程序集并尝试添加新客户,myDataContext.SubmitChanges()就会抛出一个错误;ArgumentNullException,Value不能为null参数名称:cons-由于新的私有访问修饰符,L2S似乎很难实现Customer对象。在另一种情况下,为linq to sql提供的代码生成工具无法与L2S的真正功能抗衡。感觉上微软真的希望每个人都远离L2。