2016-08-09 4 views
1

Вот моя проблема: мне нужно представлять отношения от одного до многих. У одной компании много магазинов. Это мой код:Как написать один для многих классов C#

public class Company 
{ 
    public int Id; 

    public string Name; 

    public string Email; 

    public Guid GUID; 
} 

public class Store 
{ 

    public int Id; 

    public int CompanyId; 

    public string Name; 

    public int NoOfEmployees; 

    public Guid GUID; 
} 

Мой вопрос: как это работает без использования виртуальных и hashsets? это реализация?

Спасибо.

+0

Возможно, было бы удобно, чтобы у Компании был список , и действительно для Магазина иметь собственность Компании ... это упрощает навигацию – NDJ

+0

Если все в порядке, это зависит от того, что вы планируете с ней делать. И критерии «без использования виртуальных и хэшсетсов» немного неясны .... Я бы предпочел присвоить классу 'Company' свойство вроде' public List Магазины {get; set;} 'Это будет содержать все магазины принадлежащих этой компании. Таким образом, вы не всегда должны искать обратный поиск, в магазинах которого есть правильный 'CompanyId'. –

+0

Я не согласен с тем, что виртуальные свойства или коллекции на объекте упрощают навигацию. То, что вы сделали, абсолютно нормально, одно изменение, которое я бы сделал, это то, что вам не понадобится 'int Id', потому что если store ** должен ** иметь компанию, тогда должно быть только «CompanyId» в качестве основного и внешнего ключа –

ответ

3

Ты можешь использовать просто List, где бы вы экономите все магазины этой компании.

public class Company 
{ 
    public int Id; 

    public string Name; 

    public string Email; 

    public Guid GUID; 
    // List of all Stores 
    public List<Store> AllTheStores; 

    public Company() 
    { 
     AllTheStores = new List<Store>(); 
    } 
} 

EDIT:

Свойство: public int CompanyId; делает только действительно смысл, если более чем один Company может иметь тот же Store. В противном случае вы можете получить доступ в магазины через компании:

Company c = new Company(); 

Store s = c.AllTheStores.Find(x=>x.Name == "MyStore"); 

// or 
List<Store> largeStores = c.AllTheStores.Where(x=>x.NoOfEmployees > 200).ToList(); 
+0

, почему это необходимо? – Ovidiu

+0

Не обязательно –

+0

@ Ovidiu Вы имеете в виду, почему список необходим? –

1

Как вы говорите

Одна компания имеет много магазинов.

В этом заявлении содержится ваш ответ.

Company использовать класс следующим образом, вместо того, чтобы companyID в Store класса

public class Company 
{ 
    public int Id; 
    public string Name; 
    public string Email; 
    public Guid GUID; 

    // put a List of all Stores 
    public List<Store> Stores; 
} 
+0

«В этом заявлении ваш ответ« блестящий! +1 для предложения Йоды. –

0

Вы должны использовать компании класса сам объект, а не просто иметь CompanyID в классе Store.

public class Company 
{ 
    public int Id; 

    public string Name; 

    public string Email; 

    public Guid GUID; 

    public List<Store> Stores; 
} 

public class Store 
{ 

    public int Id; 

    public Company Company; // Can get CompanyId using StoreObj.Company.Id 

    public string Name; 

    public int NoOfEmployees; 

    public Guid GUID; 
} 
1

Чтобы ответить на вопрос, как это работает.

Рассмотрим у вас есть идентификатор компании, которую вы хотите получить все магазины для, вы можете просто сделать:

using (var dbcontext = new DbContext()) 
{ 
    var stores = await dbcontext.Stores.Where(x => x.CompanyId == companyId).ToListAsync(); 
} 

Вам не нужно навигационные свойства. У меня их никогда не было, они только когда-либо вызывали у меня проблемы, я не говорю, что они вызовут у вас проблемы. Это всего лишь удобная вещь (по тому, что кажется), которая, по моему мнению, скрывает базовое представление SQL и запросы EF могут работать. Теперь будет несколько запросов, которые вы действительно заботитесь о генерации EF, когда вы доберетесь до них, вы обнаружите, что свойства навигации препятствуют вам.

Если вы хотите сохранить записи, просто назначьте каждый Store реальный Company.Id, и вы выполните обязательства внешнего ключа.

Одно изменение, которое вы могли бы сделать (если это применимо к данному случаю) является то, что вы можете удалить int Id и использовать CompanyId в качестве первичного и внешнего ключа

public class Store 
{ 

    // public int Id; just remove this 

    public int CompanyId; // make this a foreign key using fluent or attributes. 

    public string Name; 

    public int NoOfEmployees; 

    public Guid GUID; 
} 

Это гарантирует, что вы сохраняете 1 ко многим отношений , , если эти многие должны существовать только для одной компании. Если нет, не беспокойтесь об этом.

Смежные вопросы