4

我有一个属性(“IsLatest”),我已将“只读”设置为“真”

这是 XML:

<Column Name="IsLatest" Type="System.Boolean" DbType="Bit NOT NULL" IsReadOnly="true" CanBeNull="false" />

为什么代码生成器会生成公共的“get”和“SET”访问器?

另外,有没有办法让它为只读属性生成 SET(多么新颖的想法)?

注意:我正在使用带有 .NET 3.5 SP1 的 V2008 SP1

4

3 回答 3

2

编辑:我刚刚检查过,它没有生成设置器......你使用的是 3.5SP1 吗?


如果你是手工做的,我认为你可以;您只需在更新时使用 Storage 属性属性(on ColumnAttribute)将其指向字段(get 满足查询要求)..

于 2009-03-16T23:45:01.537 回答
1

编辑:我已将成功的解决方法添加到此答案的底部。

这很奇怪......但是,如果我将“Access”属性设置为'Public' 以外的任何东西,“set”就会消失:

使用“Access=Public”和“ReadOnly=True”:

public bool IsLatest
{
    get
    {
        return this._IsLatest;
    }
    set
    {
        if ((this._IsLatest != value))
        {
            this.OnIsLatestChanging(value);
            this.SendPropertyChanging();
            this._IsLatest = value;
            this.SendPropertyChanged("IsLatest");
            this.OnIsLatestChanged();
        }
    }
}

使用“Access=Protected”和“ReadOnly=True”:

protected bool IsLatest
{
    get
    {
        return this._IsLatest;
    }
}

我不知道为什么存在这个错误(至少对我来说?),但如果我让它工作(公共和只读),我会更新这个答案。

编辑:这是可悲的解决方法:

我已经从我的 DBML 文件中删除了该属性,并简单地添加了我自己的“部分”类并自己设置了列:

public partial class ServicerData
{
    private bool _IsLatest = default(bool);

    [Column(Storage = "_IsLatest", AutoSync = AutoSync.Always, DbType = "Bit NOT NULL", IsDbGenerated = true, UpdateCheck = UpdateCheck.Never)]
    public bool IsLatest
    {
        get
        {
            return this._IsLatest;
        }
    }
}

这不是我想做的,但似乎没有别的办法。

于 2009-03-17T11:37:57.267 回答
0

如果没有 setter,Linq to Sql 将如何为该属性赋值?这意味着如果它从数据库中获取数据,无论是通过 Linq 查询还是来自 Store 过程的结果,Linq 必须能够根据这些结果为您创建这些对象。如果没有设置属性,它就不能这样做。

于 2009-03-16T18:29:28.767 回答