如何在Linq2SQL实体上自定义属性?

时间:2009-06-19 20:07:35

标签: .net linq-to-sql

我知道您可以通过部分类自定义实体,但是修改实体属性的一般方法是什么?如果我想更改get / set中的逻辑怎么办?添加属性怎么样?我不想编辑自动生成的代码 - 人们如何解决这个问题?

5 个答案:

答案 0 :(得分:1)

根本不要自动生成代码。您可以在不使用设计器的情况下构建自己的linq到sql类。

编辑:我这样做的懒惰方式是自动生成代码,将其粘贴到非生成的文件中,然后删除设计器文件。尽管如此。

答案 1 :(得分:1)

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();

很多扩展点!

马克

答案 2 :(得分:0)

由于Linq2Sql实体未被密封,您可以从Linq2Sql类派生并在派生类中进行更改。

在我的项目中,我不会对Linq2Sql类进行任何更改。相反,我建立了自己的POCO套装,我可以根据自己的需要量身定制。然后我只使用Linq2Sql来填充/保存我的POCO使用存储库模式。

Rob Connery在他的博客上发布了一个名为ASP.NET MVC Storefront的精彩网络广播系列。在其中一个首次网络广播中,他使用Linq2Sql作为存储库与POCO一起使用

答案 3 :(得分:0)

检查出来:

它比sqlmetal更好(设计师用它来生成你的代码)

http://plinqo.com/default.aspx?AspxAutoDetectCookieSupport=1

虽然需要Codesmith许可证,但恕我直言是非常值得的。

答案 4 :(得分:0)

如果没有一些严重的攻击,修改未标记为虚拟的类中的属性的get / set中的逻辑是不可能的(查看模拟框架以获取如何绕过这些限制的示例)。这就是将某些东西标记为虚拟的重点,使其成为虚拟呼叫和性能损失的牺牲品。

Metadatatype 标记允许您使用无法修改的属性注释现有类:

注意:this related question

中被盗
[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; }
}