首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将DataGrid绑定到EntitySet

将DataGrid绑定到EntitySet
EN

Stack Overflow用户
提问于 2013-11-28 22:06:24
回答 1查看 304关注 0票数 1

在本例中,我有一个客户,它可以有许多PhoneNumbers。这些对象是:

The Customer

代码语言:javascript
复制
[Table(Name = "Customers")]
public class Customer : INotifyPropertyChanged
{
    private String id;

    private String givenName;
    private String surname;

    private EntitySet<PhoneNumber> phoneNumbers;

    //INotifyPropertyChanged implementation was elided...

    [Column(IsPrimaryKey=true, Storage="id", Name="Id", DbType="NVarChar(10) NOT NULL", CanBeNull=false)]
    public String Id
    {
        get { return this.id; }
        set
        {
            if (this.id != value)
            {
                 this.id = value;
                 this.OnPropertyChanged("Id");
            }
        }
    }

    [Column(Storage="givenName", Name="GivenName", DbType="NVarChar(50) NOT NULL", CanBeNull=false)]
    public String GivenName
    {
        get { return this.givenName; }
        set
        {
            if (this.givenName != value)
            {
                this.givenName = value;
                this.OnPropertyChanged("GivenName");
            }
        }
    }

    [Column(Storage="surname", Name="Surname", DbType="NVarChar(50) NOT NULL", CanBeNull=false)]
    public String Surname
    {
        get { return this.surname; }
        set
        {
            if (this.surname != value)
            {
                this.surname = value;
                this.OnPropertyChanged("Surname");
            }
        }
    }

    [Association(Name="FK_PhoneBook_Customers", Storage = "phoneNumbers", ThisKey="Id", OtherKey = "CustomerId")]
    public EntitySet<PhoneNumber> PhoneNumbers
    {
        get
        {
            return this.phoneNumbers;
        }
        set
        {
            if (this.phoneNumbers!= value)
            {
                this.phoneNumbers.Assign(value);
                this.OnPropertyChanged("PhoneNumbers");
            }
        }
    }

    public Customer() { this.phoneNumbers = new EntitySet<PhoneNumber>(); }
}

与PhoneNumber

代码语言:javascript
复制
[Table(Name = "PhoneBook")]
public class PhoneNumber: INotifyPropertyChanged
{

    private int id;
    private String customerId;
    private String number;

    private EntityRef<Customer> customer;

    //INotifyPropertyChanged implementation was elided...

    [Column(IsPrimaryKey=true, IsDbGenerated=true, Storage="id", Name="Id", DbType="int", CanBeNull=false)]
    public int Id
    {
        get { return this.id; }
        private set
        {
            if (this.id != value)
            {
                this.id = value;
                this.OnPropertyChanged("Id");
            }
        }
    }

    [Column(Storage="customerId", Name="CustomerId", DbType="NVarChar(10) NOT NULL", CanBeNull=false)]
    public String CustomerId
    {
        get { return this.customerId; }
        set
        {
            if (this.customerId != value)
            {
                this.customerId = value;
                this.OnPropertyChanged("CustomerId");
            }
        }
    }

    [Column(Storage="number", Name="Number", DbType="NVarChar(10) NOT NULL", CanBeNull=false)]
    public String Number
    {
        get { return this.number; }
        set
        {
            if (this.number != value)
            {
                this.number = value;
                this.OnPropertyChanged("Number");
            }
        }
    }

    [Association(IsForeignKey=true, Name="FK_PhoneBook_Customers", ThisKey="CustomerId", OtherKey = "Id")]
    public Customer Customer
    {
        get { return this.customer.Entity; }
        set { this.customer.Entity = value; }
    }

    public PhoneNumber() { this.customer = new EntityRef<Customer>(); }
}

我创建了一个DataContext并获得了一个客户(简化版本):

代码语言:javascript
复制
db = new DataContext(@"server=WIN-EL78137MUMS\SQLEXPRESS;database=SandBox;integrated security=SSPI");

// Get a typed table to run queries.
customers = db.GetTable<Customer>();

custQuery =
    from cust in customers
    orderby cust.Id
    select cust;

Customer = custQuery.Skip(5).Take(1).First();

在XAML中,我添加了DataGrid并将其绑定到Customer的PhoneNumbers属性。

代码语言:javascript
复制
<DataGrid ItemsSource="{Binding PhoneNumbers}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Id" Binding="{Binding Id, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
        <DataGridTextColumn Header="CustomerId" Binding="{Binding CustomerId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        <DataGridTextColumn Header="Number" Binding="{Binding Number, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    </DataGrid.Columns>
</DataGrid>

很抱歉做了长时间的介绍,这里是我的问题,还有一些问题--当我试图在网格中添加一个新的电话号码并调用db.SubmitChanges()时,我会收到以下错误消息:“试图删除客户和PhoneNumber之间的关系。但是,关系的一个外键(PhoneNumber.CustomerId)不能设置为null。”现在,我不希望用户在需要添加电话号码时不断地写入用户的id,因为正确的客户已经被选中,并且我正在尝试向他的号码集合中添加另一个号码。如何才能/应该这样做?

其他问题如下:

  1. 在按Enter之前,似乎不会添加新行,如果我输入电话号码,然后单击一个调用db.SubmitChanges()的按钮,就不会发生任何事情(三个收集器/update/delete都为空)。
  2. 我必须在PhoneNumber举行EntityRef吗?在野外有很多例子根本没有它,有些人提到它是一对一的连接实用程序。
  3. 在任何一种情况下,将EntityRef定义为IsForeignKey=true有点奇怪,对我来说,将PhoneNumber.CustomerId定义为ForeignKey听起来更合理,但是当我尝试用ForeignKey标记它时( IsForeignKey=true,Name="FK_AddressBook_Customers",ThisKey="CustomerId",OtherKey = "Id"),我在应用程序启动时发现了这个错误,“无法在'String‘类型上找到键成员'Id’的键'Id‘。键可能是错误的,或者'String’上的字段或属性已经更改了名称”。我在网上找不到任何关于这方面的有用信息。应该用另一种方式来标记吗?它应该被标记吗?
  4. 我必须这样做(还是应该这样做?)将来自两端的外键(EntitySet和EntityRef)命名为一个名称(就像我在另一个例子中看到的那样,这里的方法是一样的)?
EN

回答 1

Stack Overflow用户

发布于 2013-11-29 19:07:55

好的,主要问题的答案很简单,在PhoneNumber中的关联属性中,我忘记了存储属性。正确的属性定义如下:

代码语言:javascript
复制
[Association(IsForeignKey=true, Name="FK_PhoneBook_Customers", Storage="customer", ThisKey="CustomerId", OtherKey = "Id")]
public Customer Customer
{
    get { return this.customer.Entity; }
    set { this.customer.Entity = value; }
}

第二个问题的答案是“不”,如果没有它,我甚至根本不会面对主要的问题。但出于某种原因,Visual会创建此回引用。如果你们中有人知道为什么会有用,请分享你们的想法。

第三个问题的答案也是“不,它不应该被标记”。一旦一切都开始工作,没有任何关联属性附加到PhoneNumber.CustomerId属性,这就很明显了。

对于第四个问题,我也有一个部分的答案--“不,我不需要从两个结尾都给出相同的名字--它将继续用不同的名字命名。”但是,也许我应该给出相同的名字(同样,VS把它们命名完全相同),因为一些未知的和不需要的后果。再一次,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20275406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档