尝试在WCF服务中实现linq-sql时出现Bad Storage属性异常

时间:2010-10-09 21:22:41

标签: wcf linq-to-sql datacontract

我一直在尝试获取WCF服务来访问存储在本地文件系统上的文件数据库,但目前无效。

我在visual studio 2010中创建了一个名为data.mdf的数据库,并在其上运行了这个SQL查询。

create table Person 
   (PersonID int identity (1000,1) not null, 
    Name nvarchar(50) not null,
    Address nvarchar(max)

create table ImportantPerson
   (ImportantPersonID int indentity(1000,1) not null, 
    Name nvarchar(50) not null,
    Address nvarchar(max)

它成功创建了我想要的表,所以我继续创建我的DataContract:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Data.Linq;
using System.Data.Linq.Mapping;
namespace MyDataContract
{
    public class DataDB: DataContext
    {
        public Table<Person> Persons;
        public Table<Important> Importants;
        public DataDB(string connstr)
            : base(connstr)
        {
        }

    }
 [DataContract]
    [Table(Name = "Person")]
public class Person
{
 private int _ID;
private String _Name;
private String _Address
public Person()
{
}
public Person(String Name, String Address)
{
_Name = Name;
_Address = Address;
}
[DataMember]
[Column(IsPrimaryKey = true, Storage = "PersonID", DbType="int not null", IsDbGenerated = true)]
public int PersonIdentification
{
get{ return _PersonID;}
set{ _PersonID = value;}
}
[DataMember]
[Column(Storage = "Name")]
{
get{ return _Name;}
set{ _Name = value;}
}
[DataMember]
[Column(Storage = "Address")]
{
get{ return _Address;}
set{_Address= value;}
}
public class Person
{
 private int _ID;
private String _Name;
private String _Address
public ImportantPerson()
{
}

public ImportantPerson(String Name, String Address)
{
_Name = Name;
_Address = Address;
}
[DataMember]
[Column(IsPrimaryKey = true, Storage = "ImportantPersonID", DbType="int not null", IsDbGenerated = true)]
public int PersonIdentification
{
get{ return _PersonID;}
set{ _PersonID = value;}
}
[DataMember]
[Column(Storage = "Name")]
{
get{ return _Name;}
set{ _Name = value;}
}
[DataMember]
[Column(Storage = "Address")]
{
get{ return _Address;}
set{_Address= value;}
}

当我尝试实例化与数据库的连接时

MyDataContract.DataDB data = new MyDataContract.DataDB(@"c:\data\data.mdf");

我得到了一个例外

  

Bad Storage属性:'PersonID'开启   会员   'MyDataContract.Person.PersonIdentification'。

有人可以帮我弄清楚出了什么问题吗?从我读过的所有内容来看,虽然我可能会错过一些东西,但这应该有用。

3 个答案:

答案 0 :(得分:2)

存储成员必须是私有的。如果公共名称与列名称相同,则不需要“Name =”标记。

答案 1 :(得分:1)

Ladislav Mrnka是对的,但这是由复制粘贴错误引起的。我确实自己解决了这个问题,所以如果有人遇到同样的问题,我会发布明确的解决方法。 要修复它,我还必须输入字段的名称,并更改存储属性,如下所示: 表人具有“名称”并且在Person对象中具有私有实例变量“_Name” 该物业必须设置为:

[DataMember]
[Column(Name="Name",Storage="_Name")]
public String Name
{ 
get{...}
set{...}
}

还应该提一下,当intance变量是私有且属性是公共的时,我才成功地使它工作。

答案 2 :(得分:0)

我在代码中缺少ImportantPerson类,Table属性指向正确的DB表,而您的代码包含Person类两次。