У меня есть две простые таблицы и внешний ключ, определенный в SQL Server Express:
Продукт
- ProductID [auto-inc]
- Имя
- CompanyID [not-null]
Компания
FK_Product_Company
- Product.CompanyID = Company.CompanyID
Я создал модель данных сущности ADO.NET и добавил в нее все таблицы. Файл .edmx показывает отношение 1-ко-многим в конструкторе. Я вручную заполнил базу данных данными, которые гарантировали бы, что у каждого продукта есть компания. Однако всякий раз, когда я пытаюсь получить доступ к компании продукта, она всегда возвращает ноль вместо экземпляра компании.
Например, при запуске следующего кода в C # возвращается ноль:
var _db = new MyDBEntities();
var product = (from p in _db.Product
where p.ProductID == 3
select p).First();
product.Company // == null
Есть ли какие-то шаги, которые мне не хватает, чтобы заставить это работать?
Спасибо
Вещи, которые я пробовал:
Запуск следующего SQL-кода корректно возвращает запись о компании.
SELECT Company.*
FROM Product
LEFT JOIN Company ON (Product.CompanyID = Company.CompanyID)
WHERE Product.ProductID = 3
Следующее, что я хотел бы сделать для устранения этой проблемы, это запустить следующий код:
var _db = new MyDBEntities();
var product = (from p in _db.Product
where p.ProductID == 3
select p).First();
var company = (from c in _db.Company
where c.CompanyID == product.CompanyID
select c).First();
Однако это не компилируется, поскольку поле Product.CompanyID скрыто генератором ORM, и я не вижу опции в конструкторе, чтобы добавить его.
Следующая лучшая вещь, которую я запустил, это следующее, и она вернула компанию:
var _db = new MyDBEntities();
var company = (from c in _db.Company
where c.CompanyID == 2
select c).First();
Просто чтобы прояснить, Продукт с ID 3 соответствует Компании с ID 2.
Я попытался создать точно такое же отношение, используя LINQ to SQL Classes , и оно отлично работает.
Конечно, вместо того, чтобы использовать класс DB Entities, я использую класс Data Context.