2011-10-17 85 views
2

以我LINQ生成类部分类的虚方法,我有这样的方法:覆盖在被生成

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", 
      AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", 
      IsPrimaryKey=true, IsDbGenerated=true)] 
public int Id 
{ 
    get 
    { 
     return this._Id; 
    } 
    set 
    { 
     if ((this._Id != value)) 
     { 
      this.OnIdChanging(value); 
      this.SendPropertyChanging();  
      this._Id = value;    
      this.SendPropertyChanged("Id"); 
      this.OnIdChanged(); 
     } 
    } 
} 

以我编码部分类,我从基类延伸。基类定义:

public virtual int Id { get; set; } 

的概念是,我可以在碱基类级别添加在基类水平equals和hashCode,以及一些其它功能。问题是生成的类(从LINQ到SQL)没有得到override关键字,因此它不起作用。如果它有override我会全部设置。

请建议如何完成此操作。

回答

0

你可以做的基类abstract,然后Id属性变得

public abstract int Id { get; set; } 

生成的代码将实现抽象属性。

+0

很好用。它要求每个子类都有价值,但在我们的模型中,它们都是。 – ZB1

0

部分类与重写类不同。对于部分课你只是说。好吧,我有1班,但我已经分裂了多个文件的源代码(主要是为了维护原因,例如将自动生成的代码从您自己的代码中分离出来)。 C#编译器只是将部分类的每个部分合并在一起,并将其威胁为1个类。当然,重写一个类意味着你创建一个新的类,它承担了基类的特性。这是非常不同的。

现在指导EF如何生成代码(假设您使用的是EF)可能但并不容易。你可以做的一个选择是改变你的基类不使用Property Id,而是使用比较可识别的(和specifix?)名称,比如'CompareIdentifier'。有了这个,你可以在派生类中重写CompareIdentifier以返回自动生成的ID。当然,所有的比较工作与CompareIdentifier