如何从Linq-To-Sql映射中排除成员



我有这样一个类:

public class MyClass {
    [Column(Name="StoredColumn", DbType="int")]
    public int Stored;
    public int ForDisplay {
       get { return Stored * 1000; }
    }
}

关键是ForDisplay不存储在数据库中-我只是需要它更方便的代码。

我尝试运行一个SQL查询,返回一个行集,并得到这个InvalidOperationException:

不能给成员'ForDisplay '赋值。它没有定义setter

我不希望ForDisplay被Linq-To-Sql所触及。如何告诉Ling-To-Sql不要碰它?

你不需要告诉Linq to Sql它不应该触及"ForDisplay"属性。通常,所有没有明确标记为Column属性的属性都被视为应用程序逻辑的临时部分,不会从数据库中持久化或检索。

然而,如果你想通过一个存储过程从数据库中检索一些记录,比如GetMyClasses,那么设计器将创建一个新的类GetMyClassesResult。如果查看生成的代码,就会注意到类没有使用Table属性进行装饰。在这种情况下,映射器假定必须分配每个属性。如果查询中没有对应值的属性,则映射器将尝试将该属性设置为default(T),但由于没有setter,将抛出异常。

总之,长话短说,只要添加

[Table]
public class MyClass
{
  ...
}

可以用部分类扩展linq2sql。关键不在于修改原来的类,而在于创建一个额外的部分类:

 public partial class MyClass
 {
    public int ForDisplay {   
       get
       {
           return this._Stored * 1000; 
       }   
    }   
  }

尝试将列声明为计算列,如下所示:

public class MyClass 
{ 
    [Column(Name="StoredColumn", DbType="int")]     
    public int Stored;      
    [Column(Name="ForDisplay", Expression="StoredColumn * 1000")]
    public int ForDisplay 
    {        
        get { return Stored * 1000; }     
    } 
} 

应该可以。

我的问题是从表值函数返回值,其中模型没有装饰

[Table]

在类上。我可以确认在额外的部分类中添加[Table]是有效的

[Table]
public partial class MyClassFromTVF
{
        public int ForDisplay {
             get { return Stored * 1000; }
        }
}

最新更新