Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2015, 21:01   #1
Ryabinin313
Пользователь
 
Регистрация: 25.09.2010
Сообщений: 24
Вопрос C# + PostgreSQL. Как сделать связь один ко многим?

Всем привет!
Ситуация следующая. Есть таблицы(PostreSQL):
Код:
CREATE TABLE CrmUser
(
    id SERIAL UNIQUE PRIMARY KEY,
    email VARCHAR(50) UNIQUE NOT NULL,
    password_hash VARCHAR(40) NOT NULL,
    forgotten bool NOT NULL,
    сompany_id INT REFERENCES Company(id) NOT NULL
);
 
CREATE TABLE Company
(
    id SERIAL UNIQUE PRIMARY KEY,
    creation_date TIMESTAMP NOT NULL,
    user_id INT REFERENCES CrmUser(id) NOT NULL
);
И есть Модели:
Код:
    [Table("crmuser", Schema = "public")]
    public class UserDAO
    {
        [Key]
        [Column("id")]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
 
        [Required]
        [Column("email")]
        [StringLength(50)]
        public string Email { get; set; }
 
        [Required]
        [Column("password_hash")]
        [StringLength(40)]
        public string PasswordHash { get; set; }
 
        [Required]
        [Column("forgotten")]
        [DefaultValue("false")]
        public bool Forgotten { get; set; }
 
        [Required]
        [Column("role_id")]
        public int RoleId { get; set; }
 
        [Required]
        [Column("company_id")]
        [ForeignKey("Company")]
        public int CompanyId { get; set; }
 
        public virtual CompanyDAO Company { get; set; }
 
    }
 
    [Table("company", Schema = "public")]
    public class CompanyDAO
    {
        [Key]
        [Column("id")]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
 
        [Required]
        [Column("creation_date")]
        public DateTime CreationDate { get; set; }
 
        [Required]
        [Column("user_id")]
        [ForeignKey("Owner")]
        public int UserId { get; set; }
 
        public virtual UserDAO Owner { get; set; }
 
        public virtual ICollection<UserDAO> Users { get; set; }
 
        public CompanyDAO()
        {
            Users = new List<UserDAO>();
        }
    }
Проблема только с Users - как сделать правильно(базу поправить, атрибуты дописать) чтобы эта коллекция работала?

Пробовал по туториалам делать - постоянно прихожу к проблеме что в базе в таблице User нет id компании, а он как-бы есть(CompanyId).

Заранее спасибо!
Ryabinin313 вне форума Ответить с цитированием
Старый 17.08.2015, 21:11   #2
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

Интересные таблицы.

У вас реализована циклическая ссылка, которая приведет к тому, что вы не сможете вставить запись ни в первую, ни во вторую таблицу пока в другой нет хотя бы одной записи, так как обе ссылки имеют NOT NULL, а это значит что вам необходимо даже при вставке первой записи в любую из таблиц указывать идентификатор записи второй, что приведет к ошибке.

Один ко многим реализуется первичным ключом в одной таблице и ссылкой на него в другой, исходя из контекста вопроса таблица компаний должна выглядеть так
Код:
CREATE TABLE Company
(
    id SERIAL UNIQUE PRIMARY KEY,
    creation_date TIMESTAMP NOT NULL,
);
В модели сделайте соответствующие правки.
Akeloya вне форума Ответить с цитированием
Старый 17.08.2015, 21:23   #3
Ryabinin313
Пользователь
 
Регистрация: 25.09.2010
Сообщений: 24
По умолчанию

Хорошо, это поправлю.
Но основной вопрос, как сделать так чтобы в объекте компании я мог оперировать со списком юзеров?
Ryabinin313 вне форума Ответить с цитированием
Старый 18.08.2015, 18:40   #4
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Ryabinin313 Посмотреть сообщение
Хорошо, это поправлю.
Но основной вопрос, как сделать так чтобы в объекте компании я мог оперировать со списком юзеров?
В общем и целом, ваша объектная модель приложения и модель хранения данных могут различаться. Модель данных отражает то, что находится в БД для удобного оперирования данными непосредственно в коде (c#).

Соответственно у вас два варианта - отвязаться от представления данных и породить свою модель, либо же непосредственно расширить модель данных.

Второй вариант хорош простотой:
https://msdn.microsoft.com/ru-ru/lib...or=-2147217396

В первом варианте вашей объектной модели будет пофигу где хранятся данные, вы реализуете модель и методы подгрузки-выгрузки данных когда они необходимы, а затем пишите провайдер, реализующий загрузку-сохранение хоть в несколько источников (БД, хмл, веб сервис) параллельно.
Akeloya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связь многие ко многим serox БД в Delphi 3 06.05.2013 22:45
Связь один ко многим. Вывод количества "многих" Dexes SQL, базы данных 2 10.10.2012 10:38
Связь "Один ко многим", как лучше реализовать? spamer SQL, базы данных 4 26.03.2012 01:12
Связь "один ко многим"? M17 SQL, базы данных 5 21.10.2009 15:07
связь один ко многим kate158 БД в Delphi 11 19.06.2009 09:13