.net 如何制作';只读';LINQ to SQL中的属性?

.net 如何制作';只读';LINQ to SQL中的属性?,.net,linq-to-sql,readonly,.net,Linq To Sql,Readonly,我有一个属性(“IsLatest”),我已将“只读”设置为“真” 以下是XML: <Column Name="IsLatest" Type="System.Boolean" DbType="Bit NOT NULL" IsReadOnly="true" CanBeNull="false" /> 为什么代码生成器生成公共“get”和“SET”访问器 还有,有没有办法让它不为只读属性生成一个集合(多么新颖的想法) 注意:我将V2008 SP1与.NET 3.5 SP1一起使用如果没

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

以下是XML:

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

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

还有,有没有办法让它不为只读属性生成一个集合(多么新颖的想法)


注意:我将V2008 SP1与.NET 3.5 SP1一起使用

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

编辑:我刚刚检查过,它没有生成setter。。。您正在使用3.5SP1吗



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

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

这很奇怪。。。但是,如果我将“Access”属性设置为除“Public”之外的任何属性,则“set”将消失:

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

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

我不知道为什么会存在这个bug(至少对我来说是这样),但如果我让它工作(公共的,只读的),我会更新这个答案

编辑:以下是令人伤心的解决方法:

我已经从我的DBML文件中删除了属性,只是添加了我自己的“partial”类,并自己设置了列:

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;
        }
    }
}

这不是我想做的,但似乎没有其他方法。

在这种情况下,设置程序应该受到保护。它将如何设置它?ColumnAttribute(和元模型)允许您将存储属性指定为私有字段。问题是,我不希望编译器允许有人在执行“新建”时“设置”字段有趣的是,您的没有生成一个集合。顺便说一句:我正在使用V2008 SP1和.NET 3.5 SP1。我也在VS2010、.NET 4.0中看到了这一点。我可以重新问这个问题吗?您正在使用3.5SP1吗?SP1可能很重要。。。
protected bool IsLatest
{
    get
    {
        return this._IsLatest;
    }
}
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;
        }
    }
}