Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не получается добавить ассоциированные классы, Не добавляются ассоциированные классы  
:(
    Опции темы
Fobos
Дата 5.7.2010, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



Проблема такая: есть БД с двумя таблицами, структура проста(напишу SQL запросом): 
Код

CREATE TABLE MachineModel(
    vcModel nvarchar(50),
    vcGazolineMark nvarchar(10) NOT NULL,
    fExpense float NOT NULL,
    CONSTRAINT PK_model PRIMARY KEY(vcModel)
)
CREATE TABLE Transport(
    vcGrz nvarchar(10),
    vcModel nvarchar(50),
    vcRouteNumber nvarchar(10) NOT NULL,
    fDoxod float NOT NULL,
    CONSTRAINT PK_vcGrz PRIMARY KEY(vcGrz),
    CONSTRAINT FK_vcModel FOREIGN KEY(vcModel)
        REFERENCES MachineModel(vcModel)    
)

Пишу два класса для LINQ to SQL:
Код

[Table(Name = "MachineModel")]
    public class MachineModelMy
    {
        [Column(IsPrimaryKey = true)]
        public string vcModel;

        [Column]
        public string vcGazolineMark;

        [Column]
        public Double fExpense;
     
        [Association(Name = "MachineModel_Transport", ThisKey = "vcModel", OtherKey = "vcModel")]
        public EntitySet<TransportMy> _Transport;
    }
[Table(Name = "Transport")]
    public class TransportMy
    {

        [Column(IsPrimaryKey = true)]
        public string vcGrz;

        [Column]
        public string vcModel;

        [Column]
        public string vcRouteNumber;

        [Column]
        public double fDoxod;

        [Association(Name = "MachineModel_Transport", ThisKey = "vcModel", OtherKey = "vcModel", IsForeignKey = true)]
        public EntityRef<MachineModelMy> _machModel;
        
    }

И вот такая логика:
Код

DataContext db = new DataContext(......);
            db.Log = Console.Out;
            Console.Write(' ');
            Table<MachineModelMy> machModel = db.GetTable<MachineModelMy>();
            IQueryable<MachineModelMy> machineModel = from mach in machModel
                                                    where mach.vcGazolineMark == "АИ98"
                                                     select mach;
            
            TransportMy tr = new TransportMy
            {
                fDoxod = 900,
                vcGrz = "k352ky",
                vcRouteNumber = "90",
                vcModel = "мой"
            };

            foreach (var item in machineModel)
            {
                item._Transport = new EntitySet<TransportMy>();
                item._Transport.Add(tr);
                tr._machModel.Entity = item;               
            }
            db.SubmitChanges();

Вроде все правильно и особо ничего сложного не написал, запускаю и получаю такое красивое исключение на  db.SubmitChanges():
Не удалось найти член ключа "vcModel" ключа "vcModel" для типа "EntityRef`1". Ключ может быть неверным либо поле или свойство для "EntityRef`1" содержит измененные имена.
Решил пойти другим путем и содрать этот класс из того что создает дизайнер VS(забыл как называется) и из получившегося содрал кое-что, в итоге получил практически тоже самое:
Код

[Table(Name = "MachineModel")]
    public class MachineModelMy
    {
        [Column(IsPrimaryKey = true)]
        public string vcModel;

        [Column]
        public string vcGazolineMark;

        [Column]
        public Double fExpense;

        private EntitySet<TransportMy> _Transport;

        [Association(Name = "MachineModel_Transport", Storage = "_Transport", ThisKey = "vcModel", OtherKey = "vcModel")]
        public EntitySet<TransportMy> Transport
        {
            get
            {
                return this._Transport;
            }
            set
            {
                this._Transport.Assign(value);
            }
        }        
    }
    [Table(Name = "Transport")]
    public class TransportMy
    {

        [Column(IsPrimaryKey = true)]
        public string vcGrz;

        [Column]
        public string vcModel;

        [Column]
        public string vcRouteNumber;

        [Column]
        public double fDoxod;

        private EntityRef<MachineModelMy> _MachineModel;

        [Association(Name = "MachineModel_Transport", Storage = "_MachineModel", ThisKey = "vcModel", OtherKey = "vcModel", IsForeignKey = true)]
        public MachineModelMy MachineModel
        {
            get
            {
                return this._MachineModel.Entity;
            }
            set
            {
                MachineModelMy previousValue = this._MachineModel.Entity;
                if (((previousValue != value)
                            || (this._MachineModel.HasLoadedOrAssignedValue == false)))
                {
                    //this.SendPropertyChanging();
                    if ((previousValue != null))
                    {
                        this._MachineModel.Entity = null;
                        previousValue.Transport.Remove(this);
                    }
                    this._MachineModel.Entity = value;
                    if ((value != null))
                    {
                        value.Transport.Add(this);
                        this.vcModel = value.vcModel;
                    }
                    else
                    {
                        this.vcModel = default(string);
                    }
                    //this.SendPropertyChanged("MachineModel");
                }
            }
        }        
    }

Код поменял так:
Код

 foreach (var item in machineModel)
            {
                tr.MachineModel = item;
                item.Transport.Add(tr);
            }

При той же логике это работает, разницы в коде я не вижу. В чем проблема?
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.