【发布时间】:2010-10-01 04:52:44
【问题描述】:
我知道您可以通过部分类自定义实体,但是修改实体属性的一般方法是什么?如果我想更改 get/set 中的逻辑怎么办?添加属性呢?我不想编辑自动生成的代码 - 人们如何解决这个问题?
【问题讨论】:
标签: .net linq-to-sql
我知道您可以通过部分类自定义实体,但是修改实体属性的一般方法是什么?如果我想更改 get/set 中的逻辑怎么办?添加属性呢?我不想编辑自动生成的代码 - 人们如何解决这个问题?
【问题讨论】:
标签: .net linq-to-sql
根本不自动生成代码。您可以在不使用设计器的情况下构建自己的 linq to sql 类。
编辑:我这样做的懒惰方式是自动生成代码,将其复制粘贴到未生成的文件中,然后删除设计器文件。不过由你决定。
【讨论】:
Linq2SQL 类是分部类,这意味着您可以通过添加自己的单独文件并在其中声明分部类的另一部分来轻松扩展它们。
在该文件中,您可以根据需要自定义类 - 由于它是一个单独的文件,因此代码生成不会覆盖它。
如果您查看例如AdventureWorks 数据库中的“Contact”类,Linq2SQL 将在 AdventureWorks.designer.cs 文件中生成:
[Table(Name="Person.Contact")]
public partial class Contact : INotifyPropertyChanging, INotifyPropertyChanged
{
现在您可以将“Contact.cs”文件添加到您的项目中,并扩展该部分类,例如通过引入一个新属性“DisplayName”:
public partial class Contact
{
public string DisplayName
{
get { return string.Format("{0} {1}", FirstName, LastName); }
}
}
在编译时,类的这两个部分合并在一起。
另一部分是部分方法 - 可供您实现的方法,但如果它们没有实现,编译器会优化对它们的调用。
对于 Linq2SQL 中的每个对象类,正在创建大量的部分方法(.NET 3.0 中的一项新功能) - 由您来实现!
partial void InsertContact(Contact instance);
partial void UpdateContact(Contact instance);
partial void DeleteContact(Contact instance);
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnFirstNameChanging(string value);
partial void OnFirstNameChanged();
partial void OnLastNameChanging(string value);
partial void OnLastNameChanged();
大量的扩展点!
马克
【讨论】:
由于 Linq2Sql 实体不是密封的,您可以从 Linq2Sql 类派生并在派生类中进行更改。
在我的项目中,我不会对 Linq2Sql 类进行任何更改。相反,我建立了自己的一套 POCO,我可以根据自己的需要进行定制。然后我使用 Linq2Sql 仅使用存储库模式填充/持久化我的 POCO。
Rob Connery 在他的博客 ASP.NET MVC Storefront 上有一个很棒的网络广播系列。在第一个网络广播中,他介绍了使用 Linq2Sql 作为存储库与 POCO 的结合
【讨论】:
看看这个:
它比 sqlmetal(设计者用来生成代码)要好得多
http://plinqo.com/default.aspx?AspxAutoDetectCookieSupport=1
虽然需要 Codesmith 许可证,但恕我直言非常值得。
【讨论】:
如果没有一些严重的黑客攻击,就不可能修改未标记为虚拟的类的 get/set 属性中的逻辑(查看模拟框架以获取如何绕过这些限制的示例)。这就是将某些东西标记为虚拟的全部意义所在,以牺牲虚拟调用和性能损失为代价使其成为可消耗品。
元数据类型标签,但是,将允许您使用无法修改的属性注释现有类:
[MetadataType (typeof (BookingMetadata))]
public partial class Booking
{
// This is your custom partial class
}
public class BookingMetadata
{
[Required] [StringLength(15)]
public object ClientName { get; set; }
[Range(1, 20)]
public object NumberOfGuests { get; set; }
[Required] [DataType(DataType.Date)]
public object ArrivalDate { get; set; }
}
【讨论】: