Я пытаюсь установить связь «один ко многим» с linq на Windows Phone 8. Моя проблема в том, что в поле EntitySet‹> только один из классов, который должен быть сохранен, действительно сохраняется в базе данных. Поэтому я сделал простой проект, чтобы дать вам представление о моей проблеме. Есть два класса Person и Number. У одного человека может быть много номеров.
Вот числовой класс:
[Table]
class Number
{
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int NumberID { get; set; }
[Column]
public int PhoneNumber { get; set; }
}
И класс Person:
[Table]
class Person
{
private EntitySet<Number> numbers = new EntitySet<Number>();
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int PersonID { get; set; }
[Column]
public string Name { get; set; }
[Association(Storage = "numbers", ThisKey = "PersonID", OtherKey = "NumberID")]
public EntitySet<Number> Numbers
{
get { return numbers; }
set
{
numbers.Assign(value);
}
}
}
Когда я сейчас пытаюсь вставить человека с тремя числами:
EntitySet<Number> numbers = new EntitySet<Number>();
DataBase db = new DataBase(App.DBConnectionString);
Number num1 = new Number() { PhoneNumber = 111111 };
Number num2 = new Number() { PhoneNumber = 222222 };
Number num3 = new Number() { PhoneNumber = 333333 };
Person person = new Person() { Name = "Donald" };
numbers.Add(num1);
numbers.Add(num2);
numbers.Add(num3);
person.Numbers = numbers;
try
{
db.Persons.InsertOnSubmit(person);
db.SubmitChanges();
}
catch (Exception s)
{
// do nothing
}
А затем попробуйте снова получить данные:
DataBase db = new DataBase(App.DBConnectionString);
string text = "";
foreach (Person person in db.Persons)
{
foreach (Number num in person.Numbers)
{
text += num.PhoneNumber + System.Environment.NewLine;
}
}
TextBlock.Text = text;
я получаю только первый номер телефона, который является «111111». Интересно, что при втором запуске текстовая строка содержит «111111» и «222222». Это потому, что во втором лице сохраняется второй номер телефона, а в третьем лице — третий номер телефона и так далее. Итак, если вы делаете это достаточно часто, вы получаете: 111111 222222 333333 111111 222222 333333 ... Кстати, если вы перейдете с отладчиком к 'db.Persons.InsertOnSubmit(person);' и посмотрите на «человека», там есть список со всеми тремя числами. Так что должно работать...
Я очень старался, но не могу найти способ сделать это правильно. Однако я подозреваю, что это атрибут [Association].
Вот ссылка на источник, чтобы вы могли получить полную картину, если хотите: https://docs.google.com/file/d/0B5G4zya_BlZyUlU0azVvbVdiajA/edit?usp=sharing