【问题标题】:How do I exclude a member from Linq-To-Sql mapping?如何从 Linq-To-Sql 映射中排除成员?
【发布时间】:2011-12-07 08:43:23
【问题描述】:

我有这门课:

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 不去碰它?

【问题讨论】:

标签: c# .net linq linq-to-sql


【解决方案1】:

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

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

总之,长话短说,添加

[Table]
public class MyClass
{
  ...
}

你的班级应该可以解决这个问题。

【讨论】:

  • 能否提供一个vb版本?
【解决方案2】:

您可以使用部分类扩展 linq2sql。关键元素不是修改原始类而是创建一个额外的部分类:

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

【讨论】:

  • 这适用于表格。它不适用于存储过程。
【解决方案3】:

尝试像这样将该列声明为计算列:

public class MyClass 
{ 
    [Column(Name="StoredColumn", DbType="int")]     
    public int Stored;      

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

应该可以的。

【讨论】:

  • 试过 - 行为没有变化。
【解决方案4】:

我的问题是模型没有修饰的表值函数的返回值

[Table]

在课堂上。我可以确认在我的额外部分课程中添加 [Table] 是一种享受

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

【讨论】:

    猜你喜欢
    • 2010-12-28
    • 2023-03-14
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多