рд╣рдо рджреВрд╕рд░реЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рд╣реИрдВ - рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг MSTest рдкрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг


рд╣рдо рд▓рдЧрднрдЧ рдПрдХ рд╕рджреА рдХреЗ рд▓рд┐рдП рд╕рд╣рд╕реНрддреНрд░рд╛рдмреНрджреА рдордирд╛ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЕрднреА рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ ... рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдЗрд╕ рдЕрджреНрднреБрдд рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреА рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ ... рд╣рдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдорд╛рддреНрд░ рдирд╢реНрд╡рд░, рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдордЭрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЖрдзрд╛рд░ рд╣реИ рд╕реНрдерд╛рдпреА рдкреНрд░рдгрд╛рд▓реА! рд╕реЗрд▓реНрд╕рд╡реБрдорди рдХреЛ рдпрд╣ рд╕рдордЭрд╛рдирд╛ рдХрд┐рддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдирдП рдЙрддреНрдкрд╛рдж рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЦрд╛рдПрдВ! рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдиреБрднрд╡реА рд╕реБрд░рдХреНрд╖рд╛ рдЧрд╛рд░реНрдб рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рд╡реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкрдХрдбрд╝рдиреЗ рдФрд░ рдЪреБрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдпрд╣ рд╕рд╛рдмрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрджрд┐ рднрдЧрд╡рд╛рди рднрдЧрд╡рд╛рди рд╕реНрд╡рдпрдВ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдЯреАрдбреАрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд┐рд░рд╕реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдорд╣рд╛рди рдмрд╛рдврд╝ рдХреЛ рдпрд╛рдж рдХрд░реЗрдВ), рддреЛ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рднрдЧрд╡рд╛рди рдиреЗ рдЦреБрдж рдЖрджреЗрд╢ рджрд┐рдпрд╛ ...

рддрд▓рд╛рдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рд░рд╣реА рд╣реИ - рдХреНрдпреЛрдВ? рд╣рд╛рдБ, рд╕рднреА рдПрдХ рд╣реА! TDD! рдкрд╣рд▓реЗ рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ - рдлрд┐рд░ рд╢рд╛рджреА рдХрд░реЗрдВ! рдирд╣реАрдВ, рдвреАрд▓реЗ-рдврд╛рд▓реЗ рдЪрд░реНрдордкрддреНрд░ рдХреЛрдЯ рдореЗрдВ рдЫреЛрдЯреЗ рдЫреЛрдЯреЗ рдкреБрд░реБрд╖, рдпреМрди-рд╢реЛрд╖рдг рд╡рд╛рд▓реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реИрдВ, рдЕрдкрдиреА рдпреБрд╡рд╛ рдкрддреНрдиреА рдХреЛ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ...

рдареАрдХ рд╣реИ, рд╣рдо рдЖрдкрдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг - рдлрд┐рд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ!

рдореИрдВ рдкрд░реАрдХреНрд╖рд╛рд░реНрдереА рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реВрдБ ...


рдЗрд╕рд▓рд┐рдП рдЬрдм рдореИрдВрдиреЗ рдЕрдЧрд▓рд╛ рдХреЛрдб рдкрд╣рд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рдХреНрдпреЛрдВ рди рд╡рд┐рдЬрд╝реБрдЕрд▓рд╕реНрдЯрдбрд┐рдпреЛ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рд╕реАрдзреЗ рдореЗрд░реА рдбреАрдПрдПрд▓ рдкрд░рдд рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдП?

рдФрд░ рдореИрдВрдиреЗ рдХрд░ рджрд┐рдпрд╛! EntityFramework рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА, рдирдХрд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдиреАрдЪреЗ рд╣рд╛рде рдХреА рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪрд┐рдХрдирд╛рд╣рдЯ рдХреЗ рдФрд░ рдирдХрд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдзреЛрдЦрд╛рдзрдбрд╝реАред рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ - рд╡реАрдПрд╕ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВ, рдкрд░реАрдХреНрд╖рдХреЛрдВ рдХреА рддрд░рд╣ рдкреЛрд╢рд╛рдХ рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдПрдВ! (рдореИрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдХ рдХреА рддрд░рд╣ рдкреЛрд╢рд╛рдХ)

рдЯреЗрд╕реНрдЯрд░ рдХрдкрдбрд╝реЗ
рдЫрд╡рд┐

рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЭреВрда, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╣реИ!


рдЬреАрд╡рди рдХрд╛ рдорд╛рдорд▓рд╛:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛:

ObjectLink link = this.ObjectLinks.ToList().Where(x => x.SpotCode.ToLowerInvariant() == code.ToLowerInvariant()).SingleOrDefault(); 

рдпрд╣ рдХреЛрдб рдкрд░реАрдХреНрд╖рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдкрд╛рд╕ рд╕рдордп рдирд╣реАрдВ рдерд╛ - рд╡рд┐рдкрдгрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рддрддреНрдХрд╛рд▓ рдерд╛ред рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрдм рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдХреА рдЧрдИ, рдФрд░ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд░рд╛рдо рдерд╛ ... рд▓реЗрдХрд┐рди рдмрд┐рд▓ рдЧреЗрдЯреНрд╕ рдиреЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ ...

рдпрд╣ рдПрдХ рдХрд╛рд╡реНрдп рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рд╢рд░рдж рдЛрддреБ, рдмрд░реНрдл рдФрд░ рдмрд╛рд░рд┐рд╢ рдерд╛, рдзреАрд░реЗ-рдзреАрд░реЗ рдореЗрд░реЗ рдЪреЗрд╣рд░реЗ рдХреЛ рдШреВрд░рддреЗ рд╣реБрдП, рдкрддрд▓реВрди рдХреЗ рдкреИрд░реЛрдВ рд╕реЗ рдЧрдВрджрдЧреА рдзреАрд░реЗ-рдзреАрд░реЗ рдиреАрдЪреЗ рдмрд╣рддреА рдереА рдФрд░ рдЕрдкрд░рд┐рдЪрд┐рдд рд▓рдбрд╝рдХрд┐рдпреЛрдВ рдиреЗ рдлреИрд▓ рдореЗрдХрдЕрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрд╕реНрдХреБрд░рд╛рддреЗ рд╣реБрдП, рдЯреНрд░рдХреЛрдВ рдХреЛ рдЧреБрдЬрд░рддреЗ рд╣реБрдП рдбрд╛рд▓рд╛ ... рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдирд╛рдХ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкреНрд░рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛ рдЧрдпрд╛, рдЬрдм рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕рдШрд╛рддреА рдерд╛, рдпреБрджреНрдз рдХреА рдШреЛрд╖рдгрд╛ рдХрд┐рдП рдмрд┐рдирд╛ред рднреЛрд░ рдореЗрдВ, Microsoft рдиреЗ рдХрд╛рдВрдЯреЗрджрд╛рд░ рддрд╛рд░ рдХрд╛рдЯ рджрд┐рдпрд╛ рдФрд░ рдХреЛрд░ 3.0 рдЕрджреНрдпрддрди рдЬрд╛рд░реА рдХрд┐рдпрд╛ред рд╣реЛрд╕реНрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдкреБрд░рд╛рдиреЗ рдореЗрдВ рдХреНрдпреЛрдВ рдЬрд╛рдирд╛ рд╣реИ - рдХреНрдпрд╛ рдореИрдВ рдПрдХ рд╣реЛрд╕реНрдЯрд░ рд╕реЗ рднреА рдмрджрддрд░ рд╣реВрдВ? рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдФрд░ рдЕрдкрдбреЗрдЯ рдХреЛ рд░реЛрд▓ рдХрд┐рдпрд╛ ... рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ рдЕрдкрдиреА рдЖрдБрдЦреЗрдВ рдмрд╛рд╣рд░ рдХрд░ рд▓реАрдВ! рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛рдо рдирд╣реАрдВ рдЖрдИ! рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдерд╛ - рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдФрд░ рдРрд╕рд╛ рд╣реА рд╣реБрдЖ: рдкреБрд░рд╛рдиреА рдмрд┐рд▓реА рдиреЗ рд▓рд┐рдирдХреНрдпреВ рдЯреЛрд▓реЛрд╡рд░рдЗрд╡рд░реЗрдВрдЯ рд╕реЗ рдЗрд╕реЗ рдХрд╛рдЯрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ ... рдЕрдм рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдЧреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рддреИрдпрд╛рд░ рдореВрд▓реНрдп рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ... рдпрджрд┐ рдХреЛрдб рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдврдВрдХрд╛ рд╣реБрдЖ рдерд╛, рддреЛ рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рддреБрд░рдВрдд рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЦреБрдж рдкрд░ рд╕рдм рдХреБрдЫ рджреЗрдЦрд╛, рдореБрдЭреЗ рдЧреНрд░рд╛рд╣рдХ рдХреА рдХрд╕рдо рдирд╣реАрдВ рдЦрд╛рдиреА рдкрдбрд╝реА, рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдХ рдХреЛ рд╢рд░рдорд╛рдиреЗ рдореЗрдВ рд╢рд░реНрдо рдЖ рд░рд╣реА рдереА ... рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдирд╛ рдерд╛ рдФрд░ рдПрдХ рдирдИ рддреИрдирд╛рддреА рдХрд░рдиреА рдереАред

рдЙрдкрдХрд░рдг рдФрд░ рд╕рд╛рдордЧреНрд░реА:


Microsoft VisualStudio 2019
asp.net Core 3.1 (рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЕрдЧрд░ рдХреБрдЫ рднреА рд╕реНрдерд╛рдкрд┐рдд рдЕрдиреНрдп рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдиреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
SQL рд╕рд░реНрд╡рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ (рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ)
рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рд╢рд╛рдорд┐рд▓)

рдЖрдорддреМрд░ рдкрд░, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреА рд╕реНрдерд┐рддрд┐ рдмрдиреА рдирд╣реАрдВ рд░рд╣рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП MSTest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡реЗ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреБрд▓рд┐рд╕ рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗред

рдХрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореЙрдХ-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдорд┐рд▓рд╛ред
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╡рд┐рдЪрд╛рд░ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЬрдЯрд┐рд▓ рдмрд╛рддрдЪреАрдд рд╢реБрд░реВ рди рд╣реЛ рдЬрд╛рдПред
рдлрд┐рд░ рдореЙрдХ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рдЦрдиреЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╣реИ - рдирд┐рдпрдВрддреНрд░рдг + рд╕реА - рдирд┐рдпрдВрддреНрд░рдг + рд╡реА! рд╣рдо рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдмрд╛рдзрд╛рдПрдБ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА EF, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВ, DataAnnotations рдпрд╛ FluentAPI рдХреЛ рдореЙрдХ-рд▓реЗрдпрд░ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдирдХрд▓ рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреА рддрд░рд╣ рд╣реИ ... рдЕрдпрд╛, рдирд╛рдЧрд░рд┐рдХ, рддреЛрдбрд╝рдирд╛ ... рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ!

рдФрд░ рдЕрдЧрд░ рдореЙрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬрдЯрд┐рд▓ рд╣реИ, рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рд╡рд╣рд╛рдВ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдореЗрдВ рдЧрд▓рддрд┐рдпрд╛рдВ рдХреА рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ - рдореЙрдХ рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА?

рдпрд╣ рд╕рдм рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рджреЗрддрд╛ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдПрдХ рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред

рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, TRIZ: рдПрдХ рдЖрджрд░реНрд╢ рдкреНрд░рдгрд╛рд▓реА рд╡рд╣ рд╣реИ рдЬреЛ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ред рдФрд░ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдИ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдирдХрд▓реА рдХреА рд╡рд┐рдкрдХреНрд╖:

  • рдХрдИ рдкреНрд░реАрд╕реЗрдЯ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ
  • рдкрд░реАрдХреНрд╖рдг рдЧрдВрджреЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб
  • рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди
  • рдХреЗрд╡рд▓ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдзрд╛рд░ рдкрд░ рдЕрдЬреНрдЮрд╛рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп рдЖрдкрдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдирдХрд▓реА рдореЗрдВ рдЪрдврд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рднреА рд╕рдм рдХреБрдЫ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдзрд╛рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ:

  • рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдореБрдХрд╛рдмрд▓рд╛ рд╕рд░реНрд╡рд░ рдкрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ
  • рдкрд░реАрдХреНрд╖рдг рд╕рд░рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рд╣рдо рд╕реНрд╡рдпрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (MSTest рдореЗрдВ рд╡реЗ рд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ)
  • рдЖрдк рдЙрд╕ рд╕рдордп рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд░реНрд╡рд░ рдкрд░ рдпрд╣ рдЕрд▓рдЧ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдЖрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ - 10 рдЧреБрдирд╛ рд▓рдВрдмрд╛, 2 рдмрд╛рд░, рдФрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдпрд╛ рдирд╣реАрдВ)
  • рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдореИрдВ рдХрдИ рджрд┐рдиреЛрдВ рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╣рд▓ рдХрд░ рджреЗрдВрдЧреЗ, рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдкрддреНрдерд░ рдкреАрдЫреЗ рд╣реЛ рдЬрд╛рдП!

рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!

рд╣рдо рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ ASP.Net Core 3.1 рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдореЙрдбрд▓-рд╡реНрдпреВ-рдХрдВрдЯреНрд░реЛрд▓рд░) рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрдВрдбрд┐рд╡рд┐рдЬреБрдЕрд▓ рдпреВрдЬрд░ рдЕрдХрд╛рдЙрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдСрдереЗрдВрдЯрд┐рдХреЗрд╢рди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ (рдпреВрдЬрд░ рдЕрдХрд╛рдЙрдВрдЯ рдЗрди-рдРрдк рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ) рдФрд░ рдХреНрд░рд┐рдПрдЯ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

рдЫрд╡рд┐

рдЕрдм рд╕реЗ, рдореИрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ git рдореЗрдВ рд╕рд╣реЗрдЬреВрдВрдЧрд╛, рдЖрдк рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рдХреЛ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

github.com/3263927/Habr_1

рд╕реНрдиреИрдкрд╢реЙрдЯ: Snapshot_0_ProjectCreated

рднрдВрдбрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрдм рдореИрдВ рдЕрдХреЗрд▓реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд╣рдореЗрд╢рд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдпрд╣ рдЕрдм рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╕рд╣реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдИ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдирд╣реАрдВ рд╣реИ, рд╕рдм рдХреБрдЫ рд╡реАрдПрд╕ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЬреЛ рдЪрд╛рд╣реЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЖрдк рд╣рдореЗрд╢рд╛ рдкреНрд░рддрд┐рдмрджреНрдз рд░реЛрд▓рдмреИрдХ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдкреБрд░рд╛рдиреА рд╢рд╛рдЦрд╛ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╣реБрдд рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рдмрдЪрд╛рддрд╛ рд╣реИ, рдореИрдВ рд╕рднреА рдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдФрд░ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП github рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдЪ рд╣реИ, рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╡рд╣рд╛рдБ рдХреБрдЫ рджреЛрд╕реНрдд рдереЗ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╕рдм рдХреБрдЫ рдбрд┐рд▓реАрдЯ рдХрд░ рджрд┐рдпрд╛ рдерд╛ ... рдЗрд╕рд▓рд┐рдП рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдореЗрдВ рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд░рдЦрд╛ рдФрд░ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рд╕рд╛рде рд╣реА рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдЖрд░реНрдХрд╛рдЗрд╡ рдХрд┐рдпрд╛ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ Google рд╡рд░реНрдЬрди рдкрд░ рд▓реЗрдЯреЗрд╕реНрдЯ рд╡рд░реНрдЬрди рдЕрдкрд▓реЛрдб рдХрд┐рдПред рдЦреИрд░, рдПрд╕рдбреА рдлреЛрди рдкрд░ 120 рдЧрд┐рдЧреНрд╕ рд╣реИрдВ, рд░рд┐рдЬрд░реНрд╡ рдореЗрдВ рднреА, рдЕрдЪрд╛рдирдХ, рдЕрдЪрд╛рдирдХ ... рдЕрдкрдиреА рдЬреЗрдм рдореЗрдВ рдкреНрд░рддрд┐рдпрд╛рдВ рдХреЗ рд╕рд╛рде рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдмрд╕ рдЗрддрдирд╛ рдЕрджреГрд╢реНрдп рд╣реИрдВ!

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВрдиреЗ рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмрдирд╛рдИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдореБрдЭреЗ рдирдИ рд╢рд╛рдЦрд╛рдПрдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдХреБрдЫ рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдвреВрдВрдврдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

рдореИрдВ рд╕реАрдзреЗ VisualStudio рд╕реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рдирдИ рд╢рд╛рдЦрд╛ рдмрдирд╛рдКрдВрдЧрд╛, рдФрд░ рдореИрдВ рдЗрд╕реЗ рд╢реЙрд░реНрдЯ (рдордЬрд╛рдХ, Snap_1_DataBases) рдХреЗ рд▓рд┐рдП "рд╕рд┐рд╕реНрдЯрд░ рдСрдлрд╝ рдЯреИрд▓реЗрдВрдЯ" рдХрд╣реВрдВрдЧрд╛ред

рд▓рдХреНрд╖реНрдп: рдПрдХ рдХрд╛рдо рдХрдиреЗрдХреНрд╢рди рдФрд░ рдЖрдзрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ред

рд╣рдо рдЕрдкрдирд╛ рдЖрдзрд╛рд░ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 3 рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реЛрдВрдЧреЗ - рдПрдХ рдкрд░реАрдХреНрд╖рдг (рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░), рджреВрд╕рд░рд╛ рдЙрддреНрдкрд╛рджрди (рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡рд░ рдкрд░, рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛) рдФрд░ рджреВрд╕рд░рд╛ рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдп (рдбреЗрдмрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕рд╛рдЗрдЯ рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред

рддрд░реНрдХ рдпрд╣ рд╣реИ:

  • рдпрджрд┐ рд╣рдо рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рд╕рд╛рдЗрдЯ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ Habr1_Local рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛
  • рдпрджрд┐ рд╣рдо рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХреЛрдб рдбрд╛рд▓рддреЗ рд╣реИрдВ рддреЛ Habr1_Product рдХрд╛рдо рдХрд░реЗрдЧрд╛
  • рдЬрдм рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ Habr1_Test рдЖрдзрд╛рд░ рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рд╣реИ - рдХреЗрд╡рд▓ рджреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИрдВ, рдбрд┐рдмрдЧ рдФрд░ рд░рд┐рд▓реАрдЬрд╝ред рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдиреНрдпреВрдирддрдо рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВ - рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рд┐рд░реНрдл рдпрд╣ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЪрд▓рд┐рдП рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ ... рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╣реА!

Appsettings.json рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ

рдРрд╕реА рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ:

 "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-WebApp-[- ,   ];Trusted_Connection=True;MultipleActiveResultSets=true" }, 

рд╡рд╣рд╛рдВ рдЖрдкрдХреЛ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╣реА рдирд╛рдо, рд╕рд░реНрд╡рд░ рдХрд╛ рдирд╛рдо рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдирд╛рдо рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдиреНрдп рдХрдиреЗрдХреНрд╢рди рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░рд╛ рдХрд╛рдо рджреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдирд╛ рд╣реИ (рд╕реНрдерд╛рдиреАрдп рдФрд░ рдкрд░реАрдХреНрд╖рдг, рдЙрддреНрдкрд╛рджрди рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ - рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рд▓реАрдЬрд╝ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рджреВрд░рд╕реНрде рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЖрдкрдХреЛ рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ рдкреИрдирд▓ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реНрд╡рд┐рдЪ рдХрд░рдХреЗ рдХреБрдЫ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

рдЫрд╡рд┐

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдмрд╕ рдПрдХ DEBUG рд╕реНрдерд┐рд░рд╛рдВрдХ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рддрдм рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рднреА рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреМрди рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╕рдХреНрд░рд┐рдп рд╣реИред

рджреВрд░рд╕реНрде рдбрд┐рдмрдЧрд░ рд╣рдореЗрд╢рд╛ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЙрд▓реЛрдХреЛрдЯрд┐рдВрдЧ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ред рд╣рдо рдЕрдкрдиреЗ asp.net рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд░рд┐рдореЛрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЙрди рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдереАрдВред рдпрд╣рд╛рдВ рд░рд┐рд▓реАрдЬрд╝ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╣рдо рдпрд╣ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдбрд┐рдмрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣рдорд╛рд░реЗ рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдФрд░ рд╣рдо рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рдХреНрд░рдо рдореЗрдВ рдЧрд▓рддреА рд╕реЗ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рдорд┐рдЯрд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рдПрдЧрд╛

рддреЛ, рд╣рдо рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмрджрд▓рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╕рд░реНрд╡рд░ рдирд╛рдо - рдЖрдк рдЗрд╕реЗ рдЯреИрдм рджреГрд╢реНрдп рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ -> SQL рд╕рд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░

рдЫрд╡рд┐

(рдореИрдВ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдирд╛рдо рдХреЛ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдорд┐рдЯрд╛ рджреВрдВрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдЖрдк рдореБрдЭреЗ рдЖрдИрдкреА рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХреБрдЫ рдЯрд╛рдЗрдк рдХрд░реЗрдВрдЧреЗ)ред

рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ (localdb) \ ProjectsV13 рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рджреМрд░рд╛рди рдореИрдВрдиреЗ рдЕрдкрдиреА рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЛ рдХреНрдпреЛрдВ рдмреБрд▓рд╛рдпрд╛ред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрди рд░рд╣рд╛ рд╣реИ

 "DefaultConnection": "Server=(localdb)\\ProjectsV13;Database=Habr1_Local; Trusted_Connection=True;MultipleActiveResultSets=true" 

рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ ProjectV13ред рдмрд╛рдХреА рдХреЛ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
DefaultConnection рдХреЛ Habr1_Local рдореЗрдВ рдмрджрд▓реЗрдВ

рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛:

  "ConnectionStrings": { "Habr1_Local": "Server=(localdb)\\ProjectsV13;Database=Habr1_Local;Trusted_Connection=True;MultipleActiveResultSets=true" }, 

рдЕрдм рдЖрдкрдХреЛ Startup.cs рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдиреЗ рдФрд░ рд╡рд╣рд╛рдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ Habr1_Local рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ

 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Habr1_Local"))); 

рд╣рдо рдбрд┐рдмрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреБрд▓рддрд╛ рд╣реИ, рд╣рдо рдкрд╣рд▓рд╛ рдкреГрд╖реНрда рджреЗрдЦрддреЗ рд╣реИрдВ, рд▓реЙрдЧрд┐рди рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рд╡рд╣рд╛рдВ рдХреЛрдИ рднреА рд╡реИрдз рдИрдореЗрд▓ рджрд░реНрдЬ рдХрд░реЗрдВ (рдпрд╣ рдЖрдкрдХреЛ рдкрддреНрд░ рдирд╣реАрдВ рднреЗрдЬреЗрдЧрд╛, рдпрд╣ рд╕рд┐рд░реНрдл рдкреНрд░рд╛рд░реВрдк рдХреЛ рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ) рдФрд░ рд▓реЙрдЧрд┐рди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ - рдФрд░ рд╣рдо рдЗрд╕ рд╕реНрдХреНрд░реАрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рд╣рдо рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдкреБрд╖реНрдЯрд┐ рдиреАрд▓реЗ рдмрдЯрди рдХреЗ рджрд╛рдИрдВ рдУрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдЬреЛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдкреЗрдЬ рдХреЛ рд░рд┐рдлреНрд░реЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдбреЗрдЯрд╛ рдХреЛ рдкреБрди: рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╖реНрдЯрд┐ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╕реНрдХреНрд░реАрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рд▓реЙрдЧрд┐рди рд▓реЙрдЧ рдЗрди рдХрд╣рд╛:

рдЫрд╡рд┐

рдпрджрд┐ рдРрд╕реА рд╕реНрдХреНрд░реАрди рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ - рдПрдХ рдмрд╛рд░ рдЕрдиреБрд░реЛрдз рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рдиреЗ рдФрд░ рдПрдХ рдЕрдорд╛рдиреНрдп рд▓реЙрдЧрд┐рди рдкреНрд░рдпрд╛рд╕ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдкрд░, рддрдм рдХреЛрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╕ рдРрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред

рдкреНрд░рд╡рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛:
рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдЙрдкрдХрд░рдг рд╣реИ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕реЗ рдЫреВрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╣реА рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдереЛрдбрд╝рд╛ рдЫреВ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрди рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рдФрд░ рд╡рд┐рд╢реЗрд╖ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рджреЛрдиреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо / рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╛ рдЬрдм рдЖрдк рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рдХреБрдЫ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ рд╕реНрдерд╛рдиреАрдп рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдирдИ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░реЗрдВ - рдорд╛рдЗрдЧреНрд░реЗрд╢рди рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдиреАрд▓рд╛ рдмрдЯрди рд╣реИред рдЖрдзрд╛рд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рд░рд╛рдЬреНрдп рдХреЛрдб рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдФрд░ рдЗрди рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдПрдиреНрдХреЛрдбреЗрдб рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдЙрдкрдХрд░рдг рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рджреГрд╢реНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рдЖрдкрдХреЛ Git рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдмрд╕ рдРрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ C # рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдХрд░ред рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрдкрдХрд░рдг рдореЗрдВ рдПрдХ рдЦрддрд░рд╛ рд╣реИ - рдпрджрд┐ рдпрд╣ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдорд┐рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рдиреА рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ - рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛ рдЗрд╕реЗ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛

рдЫрд╡рд┐

рдпрджрд┐ рдХреЛрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ - рдпрд╛ рддреЛ SQL рд╕рд░реНрд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдерд╛, рдпрд╛ рдХреБрдЫ рдФрд░, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдордЬрд╛рдХ рдореЗрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдбреЙрдХреНрдЯрд░ рдереЗ: "рдбреЙрдХреНрдЯрд░, рдореЗрд░рд╛ рдкреИрд░ рджрд░реНрдж рд╣реЛрддрд╛ рд╣реИ ... - рдареАрдХ рд╣реИ, рдирд╣реАрдВ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкреИрд░ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рджрд░реНрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ! тАЭ

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВ рджреЛ рдФрд░ рдХрдиреЗрдХреНрд╢рди рддрд╛рд░ рдмрдирд╛рддрд╛ рд╣реВрдВ, appsettings.json рдЗрд╕ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ:

 "ConnectionStrings": { "Habr1_Local": "Server=(localdb)\\ProjectsV13;Database=Habr1_Local;Trusted_Connection=True;MultipleActiveResultSets=true", "Habr1_Test": "Server=(localdb)\\ProjectsV13;Database=Habr1_Test;Trusted_Connection=True;MultipleActiveResultSets=true", "Habr1_Production": "Server=(localdb)\\ProjectsV13;Database=Habr1_Production;Trusted_Connection=True;MultipleActiveResultSets=true" }, 

рдореИрдВ рдХрдорд┐рдЯ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реВрдВ:

рд╕реНрдиреИрдкрд╢реЙрдЯ: Snap_1_DataBases

рдПрдХ рдирдИ рд╢рд╛рдЦрд╛ рдмрдирд╛рдПрдВ, Snap_2_Configurations

рд▓рдХреНрд╖реНрдп: рдХрд╛рд░реНрдп рд╡рд┐рдиреНрдпрд╛рд╕ рдмрдирд╛рдПрдВ

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪрд╛рд▓реВ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд┐рд╕реА рд╕реЗ рдирд╣реАрдВ, рдпрд╣ рд╡реНрдпреВ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ - рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ):

 #if DEBUG  DEBUG #else  RELEASE ( DEBUG   ) #endif 

Startup.cs рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рд╡рд┐рдзрд┐:

 public void ConfigureServices(IServiceCollection services) { String ConnStr = ""; #if DEBUG ConnStr = "Habr1_Local"; #else ConnStr = "Habr1_Production"; #endif services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString(ConnStr))); services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddControllersWithViews(); services.AddRazorPages(); } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ Habr1_Local рдХреЛ рдПрдХ рдЪрд░ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛, рдФрд░ рдЕрдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХрдиреЗрдХреНрд╢рдирд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рддреЛ Habr1_Local рдпрд╛ Habr1_Product рд╣реЛрдЧрд╛

рдЕрдм рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ

рд╣рдо рдкреИрдирд▓ рдкрд░ DEBUG рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (Habr1_Local)

рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ, рд░рд┐рд▓реАрдЬрд╝ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рдЖрдзрд╛рд░ рд╣реИрдВред

рд╣реЛ рдЧрдпрд╛!

рд╕реНрдиреИрдкрд╢реЙрдЯ: Snap_3_HabrDB

рдЙрджреНрджреЗрд╢реНрдп: рдПрдХ рдЕрд▓рдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛, рдЬреЛ рддрдм рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреНрдпреЛрдВ?

рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВ:

  • рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдпрджрд┐ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╡реЗ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХреБрд▓ рд╕рдВрдХрд▓рди рд╕рдордп рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ
  • рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рддреЛ, рд╕рдорд╛рдзрд╛рди рдкрд░ рджрд╛рд╣рд┐рдирд╛ рдмрдЯрди - рдРрдб -> рдирдпрд╛ рд╕рдорд╛рдзрд╛рди рдлрд╝реЛрд▓реНрдбрд░, рдЗрд╕реЗ рдбреАрдмреА рдирд╛рдо рджреЗрдВред
рдлрд┐рд░ рдмрдирд╛рдП рдЧрдП рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рд░рд╛рдЗрдЯ - рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝реЗрдВ -> .net рдорд╛рдирдХ, рдирд╛рдо HabrDBред
рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕реЗ .net рдорд╛рдирдХ 2.0 рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рд╣реИ, рдореБрдЭреЗ рдЗрд╕реЗ 2.1 рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛
(рдЬрдм рдпрд╣ рдПрдХ рднреМрддрд┐рдХ рдкрде рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ DB рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдФрд░ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рднреА рдЭреВрда рдмреЛрд▓рдиреЗ рджреЗрдВ)ред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЫрд╡рд┐

рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдЫ ApplicationDBContext рд╣реИрдВ, рдФрд░ рд╣рдордиреЗ рдЕрдкрдирд╛ рдПрдХ рдФрд░ рдмрдирд╛рдпрд╛ рд╣реИ? рдХреНрдпрд╛ рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░реЗрдВрдЧреЗ? рдЕрдм рд╣рдо рдЙрдирд╕реЗ рджреЛрд╕реНрддреА рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджрд░реНрдн рд╣реЛрдВрдЧреЗ, рдЬреЛ рдХрд┐ рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реНрдХреАрдорд╛ рдирд╛рдо рджреЗрдВрдЧреЗ: рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдбреАрдмреЛ рд░рд╣реЗрдЧрд╛, рдФрд░ рджреВрд╕рд░рд╛ "рд╣рдмреНрд░" рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдк рд░рдЪрдирд╛ рдХреЗ рдореВрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕реЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд▓рдЧрднрдЧ рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рдкреБрдирд░реНрдирд╡реАрдиреАрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред (рдЙрджрд╛ред рдЧреЛрджрд╛рдо рд╕рдВрджрд░реНрдн рдФрд░ рдХрд░реНрдордЪрд╛рд░реА рд╕рдВрджрд░реНрдн)

рдФрд░ рдПрдХ рдФрд░ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдХреНрд╖рдг, рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреБрдЫ рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╣ рд╕реАрдзреЗ рд▓реЗрдЦ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд╛ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрддрд░ рдкрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛ рд╣реИ (рд╣рдо рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рдХрднреА-рдХрднреА рдХрд╛рдиреВрди рд╕рд╣рд┐рдд рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ)ред

рд╣рд╛рдВ, рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЖрдк рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рджрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред

рдореИрдВ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рддрд╛ рд╣реВрдВ - рдЪрд░рдг 4ред

рдЗрд╕ рдЪрд░рдг рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╣реИрдВ:

  • рдорд╛рдирдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрдиреНрдирдд рдореЗрдВ рдмрджрд▓реЗрдВ
  • Srartup.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрджрд▓реЗрдВ
  • LoginPartial рдФрд░ ViewImports рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрджрд▓реЗрдВ
  • рдХрд┐рд╕реА рдирдП рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдмрдирд╛рдПрдВ

рдЗрд╕рд▓рд┐рдП, рд╣рдо WebApp рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ HabrDB рдкрд░ ApplicationDBContext рд╡рд░реНрдЧ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдкреЛрд░реНрдЯреЗрдмрд▓ рдирд╣реАрдВ рд╣реИ, рд╕рд┐рд░реНрдл рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ WebApp рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ HabrDB рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЦреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдирд╛рдо рд╕реНрдерд╛рди рдХреЛ HabrDB рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рдмрд╣реБрдд рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВред

рд╣рд╛рдВ, рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдирд╣реАрдВ рд╣реИрдВ, рдЕрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред

Nuget рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, HabrDB рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЖрдкрдХреЛ Microsoft.AspNetCore.Identity.EntityFrameworkCore рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЫрд╡рд┐

рд╣рдо рдкреНрд░рдХрд╛рд╢ рдмрд▓реНрдм рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╣рдореЗрдВ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИред

рдЕрдВрддрд┐рдо SecurityDBContext рдлрд╝рд╛рдЗрд▓ (рдЗрд╕рдХрд╛ рднреА рдирд╛рдо рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП) рдЗрд╕ рдлрд╝реЙрд░реНрдо рдкрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ:

 using System; using System.Collections.Generic; using System.Text; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace HabrDB { public class SecurityDBContext : IdentityDbContext { public SecurityDBContext(DbContextOptions<SecurityDBContext> options) : base(options) { } } } 

рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдмрд╛рдж, рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдареАрдХ рдЗрд╕реА рддрд░рд╣ - рд╣рдордиреЗ ApplicationDBContext рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рдЙрд╕реЗ SecurityDBContext рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ред рдЕрдм рдЖрдкрдХреЛ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ ApplicationDBContext рдХреЗ рд╕рднреА рд▓рд┐рдВрдХ рдХреЛ SecurityDBContext рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЙрд╕рдХреЗ рдмрд╛рдж, WebApp рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреАрд▓реЗ рддреНрд░рд┐рдХреЛрдг рджрд┐рдЦрд╛рдИ рджрд┐рдП, рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рд▓рд┐рдВрдХ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╛рдлрд╝ рдХрд┐рдпрд╛ (рдмрд┐рд▓реНрдб -> рдХреНрд▓реАрди рд╕реЙрд▓реНрдпреВрд╢рди), рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рд╕рднреА рдбрд┐рдмрдЧ, рд░рд┐рд▓реАрдЬрд╝, рдУрдмрдЬ рдФрд░ рдмрд┐рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдЙрд╕рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛, рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд▓рд┐рдВрдХ рдЦреЛрдЬреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛, рдФрд░ рддреНрд░рд┐рдХреЛрдг рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ - рдлрд┐рд░ рд╕рдм рдареАрдХ рд╣реИред

рдЕрдм WebApp рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╣рдЯрд╛рдПрдВ, SQL Server рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ (Habr1_Local рдФрд░ Habr1_Product) рдХреЛ рд╣рдЯрд╛рдПрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЪрд▓рд╛рдПрдВред рд╣рдо рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ - рдФрд░ рдЕрдм рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред

рдЫрд╡рд┐

рдпрд╣ рд╕рд╣реА рд╣реИ, рд╣рдордиреЗ рдбреЗрдЯрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕рднреА рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдереЗ рдФрд░ рдЕрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдерд╛! рдХреНрдпреЛрдВ! рдлрд┐рд░ рдХреНрдпрд╛ рд╣рдо рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред

HabrDB рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ:
ApplicationUser.cs

рд╣рдо рдЗрд╕реЗ IdentityUser рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗрддреЗ рд╣реИрдВ

 using Microsoft.AspNetCore.Identity; using System; using System.Collections.Generic; using System.Text; namespace HabrDB { public class ApplicationUser:IdentityUser { public String NickName { get; set; } public DateTime BirthDate { get; set; } public String PassportNumber { get; set; } } } 

SecurityDBContext рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреНрд▓рд╛рд╕ рд╣реЗрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 public class SecurityDBContext : IdentityDbContext<ApplicationUser> 

рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ EntityFramework рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдорд╛рдирдХ рдПрдХ рдХреЗ рдмрдЬрд╛рдп AppllicationUser рд╡рд░реНрдЧ рд╕реЗ рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

Startup.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ:

 public void ConfigureServices(IServiceCollection services) { String ConnStr = ""; #if DEBUG ConnStr = "Habr1_Local"; #else ConnStr = "Habr1_Production"; #endif services.AddDbContext<SecurityDBContext>(options => options.UseSqlServer( Configuration.GetConnectionString(ConnStr))); services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<SecurityDBContext>(); services.AddControllersWithViews(); services.AddRazorPages(); } 

(ApplicationUser рдХреЗ рд╕рд╛рде IdentityUser рдмрджрд▓реЗрдВ)

_ViewImports.cshtml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ

HabrDB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЕрдм рд╕рднреА рджреГрд╢реНрдп рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВрдЧреЗ рдФрд░ рдЖрдкрдХреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдмрд░рдмреАрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

_LoginPartial.cshtml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╕рднреА IdentityUser рд╕реЗ ApplicationUser рдореЗрдВ рдмрджрд▓реЗрдВред

Microsoft.AspNetCore.Identity рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ рдкреНрд░рдмрдВрдзрдХ
рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ

рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдо рдХрд╣реАрдВ рднреА рдХреБрдЫ рднреА рдмрджрд▓рдирд╛ рдирд╣реАрдВ рднреВрд▓ рд░рд╣реЗ рд╣реИрдВред

рдЕрдм рдкреНрд░рд╡рд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдЖрдкрдХреЛ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХрдВрд╕реЛрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, DB / HabrDB рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪреБрдиреЗрдВ рдФрд░ рдЗрд╕реЗ рд▓рд┐рдЦреЗрдВ

 add-migration initial 

рдпрд╣рд╛рдБ рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓рд╛ рд╣реИ:

рдЫрд╡рд┐

рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдбреИрдбреА HabrDB рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдП рдФрд░ рдЗрд╕рдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреА, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдорд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖реЗрддреНрд░реЛрдВ - рдирд┐рдХрдиреЗрдо, рдмрд░реНрдердбреЗ, рдкрд╛рд╕рдкреЛрд░реНрдЯрдирдВрдмрд░ рдХреЗ рд╕рд╛рдеред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЪрд▓рд┐рдП рдФрд░ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ (рдкрдВрдЬреАрдХрд░рдг рди рдХрд░реЗрдВ, рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рдЬрдЯрд┐рд▓ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛):

рдЫрд╡рд┐

рдореБрдЭреЗ рдкреНрд░рд╡рд╛рд╕рди рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЧрдИ рдереА рдФрд░ рдореИрдВ рд╕рд╣рдордд рдерд╛ - рдпрд╣ рд╣рдорд╛рд░рд╛ рдЖрдзрд╛рд░ рд╣реИ:

рдЫрд╡рд┐

рдЗрд╕ рдЪрд░рдг рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ

рд╕реНрдиреИрдкрд╢реЙрдЯ: Snap_4_Security рддреИрдпрд╛рд░ рд╣реИ

рдкрд╛рдВрдЪрд╡рд╛рдВ рд╢реЙрдЯ рдмрдирд╛рдПрдВред

рдЙрджреНрджреЗрд╢реНрдп:

  • рдкрд░реАрдХреНрд╖рдг рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛рд░реНрдп рдХрд░реЗрдВ
  • рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдБ
  • рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЖрдзрд╛рд░ рдмрдирд╛рдПрдВ рдФрд░ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ

рд╣рдо DB рдбреИрдбреА рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ - MSTest .net рдХреЛрд░ред
DBTest рдХреЛ рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдПрдХрдорд╛рддреНрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рджреЗрдВ рдФрд░ рд╕реЛрдЪреЗрдВ ...
рдЖрдЧреЗ рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред

рд╕рдорд╕реНрдпрд╛

рд╣рдо рдПрдХ рд╕рдВрджрд░реНрдн рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рдХрдиреЗрдХреНрд╢рдирд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рд╡реЗрдмрдПрдк) рд╕реЗ рдХрд░реЗрдВ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ рд░рд┐рд▓реАрдЬ / рдбрд┐рдмрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рднреА рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ? .. рдПрдХ рдирдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯ? ?

рдирд╣реАрдВ, рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдбреЗрдЯрд╛ рд╣рд╛рдирд┐ рд╣реИ - рдХрд┐рд╕реА рддрд░рд╣ рд╣рдо рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рднреВрд▓ рдЧрдП рд╣реИрдВ, рд░рди рдСрд▓ рдЯреЗрд╕реНрдЯ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ - рдФрд░ рдкреВрд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП ... рдирд╣реАрдВ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ...

рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдВрдЧреЗ!

HabrDBContext рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓реЗрдВ:

 using System; using System.IO; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; namespace HabrDB { public class HabrDBContext:DbContext { public String ConnectionString = ""; public IConfigurationRoot Configuration { get; set; } public HabrDBContext CreateTestContext() { DirectoryInfo info = new DirectoryInfo(Directory.GetCurrentDirectory()); DirectoryInfo temp = info.Parent.Parent.Parent.Parent; String CurDir = Path.Combine(temp.ToString(), "WebApp"); String ConnStr = "Habr1_Test"; Configuration = new ConfigurationBuilder().SetBasePath(CurDir).AddJsonFile("appsettings.json").Build(); var builder = new DbContextOptionsBuilder<HabrDBContext>(); var connectionString = Configuration.GetConnectionString(ConnStr); builder.UseSqlServer(connectionString); ConnectionString = connectionString; return this; } } } 

Nuget рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛрдбрд╝реЗрдВ:

 Microsoft.AspNetCore.Identity.EntityFrameworkCore Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.Extensions.Configuration.FileExtensions Microsoft.Extensions.Configuration.Json 

CreateTestContext рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ Habr1_Test рдирд╛рдордХ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреА рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдмрд┐рд▓реНрдбрд░ рдХреЛ рджрд┐рдП рдЧрдП рдХрдиреЗрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдХ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддреА рд╣реИ, рднрд╛рдЧреЛрдВ рд╕реЗ WebApp рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкрде рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ appsettings.json рдЬреЛрдбрд╝реЗрдВ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред рдЗрд╕ рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рдЖрдЧреЗ рд╣рдо рдХрдиреЗрдХреНрд╢рдирд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ (рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)ред

рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдЖрдк рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕, рдПрдХ DLL, рдпрд╛ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕реЗрдЯрд┐рдВрдЧ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдХреНрдпреЛрдВ?

рдЖрдк рд╕реАрдзреЗ рдЯреЗрд╕реНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдЯреЗрд╕реНрдЯ рдХрдиреЗрдХреНрд╢рдирд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдПрдХ рдЕрдкреНрд░рд┐рдп рдмрд╛рдд рд╣реЛрдЧреА: рд╕рднреА рдХрдиреЗрдХреНрд╢рди рддрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдФрд░ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рд╕рд┐рд░ рдЫрд┐рджреНрд░реЛрдВ рд╕реЗ рднрд░рд╛ рд╣реИ рдФрд░ рдореИрдВ рдХреБрдЫ рдмрджрд▓рдирд╛ рднреВрд▓ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдпрд╛ рд╕рд░реНрд╡рд░ рдХрд╛ рдирд╛рдо рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╕рднреА рдХрдиреЗрдХреНрд╢рди рддрд╛рд░ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣реИрдВ, рдореИрдВ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЕрдм, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ appsettings.json рдХреЛ рдмрджрд▓рдХрд░ рдЖрдк рд╕рднреА рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм рдЪрд▓реЛ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдмрдирд╛рдПрдВред

HabrDB рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореИрдВрдиреЗ DBClasses рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдпрд╛, рд╡рд╣рд╛рдВ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдЯреЗрдмрд▓ рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрдВрдЧреАред рд╣рдо рдкрд╣рд▓реЗ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдБ:

 using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Text; namespace HabrDB.DBClasses { [Table("Phones", Schema ="Habr")] public class Phone { [Key] public int Id { get; set; } public String Model { get; set; } public DateTime DayZero { get; set; } } } 

рд╕реБрдВрджрд░рддрд╛ рдХреЗ рд▓рд┐рдП, рдореЗрд░реА рдХрдХреНрд╖рд╛ рдХреЛ "рдЯреЗрд▓реАрдлреЛрди" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрд╡рдЪрди рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ - "рдЯреЗрд▓реАрдлреЛрди"ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рддрд╛рд▓рд┐рдХрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдо рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрд┐рд╕ рдирд╛рдо рд╕реНрдерд╛рди рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (SQL рдореЗрдВ рдЗрд╕реЗ рд╕реНрдХреАрдорд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдЕрдм рд╕реМрдВрджрд░реНрдпрд╢рд╛рд╕реНрддреНрд░ рдХрд╛ рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рд╣реИ: рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдБрдЪреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреЗрдмрд▓ рд╣реЛрдВрдЧреЗ рдФрд░ рдпрд╣ рд╕рдм рдПрдХ рдвреЗрд░ рдореЗрдВ рд╣реЛрдЧрд╛ - рдЖрдк рдЖрдВрд╢рд┐рдХ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

HabrDBContext.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рдмреНрдж рд╡рд░реНрдЧ рдХреЗ рдмрд╛рдж рдЖрдВрд╢рд┐рдХ рд╢рдмреНрдж рдЬреЛрдбрд╝реЗрдВ - рдЗрд╕ рддрд░рд╣:

 public partial class HabrDBContext:DbContext 

HabrDBContext.cs рдлрд╝рд╛рдЗрд▓ рдХреА рдПрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ - рдмрд╕ CTRL + C - CTRL + V рдлрд╝рд╛рдЗрд▓ рдкрд░, рдЗрд╕рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдПрдБ, рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ HabrDBContext_Infrastructure.cs рдФрд░ рдирдИ HabrDBContext_Data.cs

рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореЗрдВ рд▓рд┐рдЦреЗрдВ:

 using HabrDB.DBClasses; using Microsoft.EntityFrameworkCore; namespace HabrDB { public partial class HabrDBContext:DbContext { public DbSet<Phone> Phones { get; set; } } } 

рдЕрдм рдпрд╣ рд╕реБрдВрджрд░ рд╣реИ - рд╣рдо рдПрдХ рдЬрдЧрд╣ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдореЗрдВ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд╕рд╛рдеред рдлрд╛рдЗрд▓реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд░реНрдЧ рд╕рдорд╛рди рд╣реИ - рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рд╡рд╛рддрд╛рд╡рд░рдг рд╕реНрд╡рдпрдВ рдЗрд╕реЗ рдХрдИ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдЧрд╛ред

рдЦреИрд░, рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░реЛ!

рд╣рдорд╛рд░реЗ рдПрдХрдорд╛рддреНрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ рдореЗрдВ рдХреЛрдб рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ:

 using HabrDB; using HabrDB.DBClasses; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Collections.Generic; using System.Linq; namespace DBTest { [TestClass] public class DBTest { [TestMethod] public void TestMethod1() { String PhoneName = "Nokia"; DateTime now = DateTime.Now; HabrDBContext db = new HabrDBContext().CreateTestContext(); db.Database.EnsureCreated(); List<Phone> Phones = db.Phones.ToList(); Assert.AreEqual(0, Phones.Count); Phone ph = new Phone(); ph.Model = PhoneName; ph.DayZero = now; db.Phones.Add(ph); db.SaveChanges(); Phone ph1 = db.Phones.Single(); Assert.AreEqual(PhoneName, ph1.Model); Assert.AreEqual(now, ph1.DayZero); } } } 

рдЯреЗрд╕реНрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдЯреИрдм (рдпрд╛ рдЯреЗрд╕реНрдЯ -> рд╕рднреА рдЯреЗрд╕реНрдЯ рдЪрд▓рд╛рдПрдБ) рдФрд░ ...

рдЫрд╡рд┐

рддреНрд░реБрдЯрд┐ рдкрд░ рдкреНрд▓реЗ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ ! рдпрд╣рд╛рдБ рдЙрди рдкрд░ рд╣реИрдВред

рд╣рдо рдкрдврд╝рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 Message: Test method DBTest.DBTest.TestMethod1 threw exception: System.InvalidOperationException: No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext. 

рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдмрдХрд╡рд╛рд╕ ...
рдареАрдХ рд╣реИ, рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд░ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗ!

рдХреНрдпрд╛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ HabrDBContext_Infrastructure.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЪрд▓реЛ рдХреЛрд╢рд┐рд╢ рдХрд░реЛ!

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { String ConnStr = ""; if (Configuration == null) { #if DEBUG ConnStr = "Habr1_Local"; #else ConnStr= "Habr1_Production"; #endif Configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json").Build(); ConnectionString = Configuration.GetConnectionString(ConnStr); } optionsBuilder.UseSqlServer(ConnectionString); } 

рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ...

рдпрд╣ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдерд╛ !!!
рдПрдХ рдирдпрд╛ рдЖрдзрд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ - рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛!

рдЫрд╡рд┐

рдРрд╕рд╛ рдХреНрдпреЛрдВ?

рдпрджрд┐ рдЖрдк OnConfiguring рдФрд░ CreateTestContext рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреБрдЫ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ CreateTestContext рдкрджреНрдзрддрд┐ рдХреЛ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдареАрдХ рд▓рдЧреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдХреЛрдИ OnConfiguring рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ ... рдХреМрди рд╣реИ? рдЪрд▓реЛ рдХреЙрд▓ рд╕реНрдЯреИрдХ рджреЗрдЦреЗрдВ - рд╣рд╛рдБ рдпрд╣ db.Database.EnsureCreated () рд▓рд╛рдЗрди рдЯреЗрд╕реНрдЯ рд╕реЗ рд╣реИ! рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдЖрдзрд╛рд░ рдирд╣реАрдВ рд╣реИ - рдЗрд╕рдХреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╡рд┐рдзрд┐ рдЗрд╕реЗ рдмрдирд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдзрд┐ рдЕрдм рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд▓реЗрддреА рд╣реИ, рдФрд░ рд╕рдВрджрд░реНрдн рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдкрд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдПрдВрд╕реНрдпреЛрд░рдХреНрд░рд┐рдПрдЯ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рд╣рдо рдЗрд╕ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡рдпрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ (рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдЯ рдкрд░), рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░, DI рдФрд░ рдЕрдиреНрдп рдЖрдХрд░реНрд╖рдХ рддрдВрддреНрд░ рднреА рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЗрдЦ рд▓реЗрдВрдЧреЗ (рдЬреЛ рднреА рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛) редрдЕрдЧрд░ рд╡рд╣ OnConfiguring рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ - рддреЛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рд╣реЛрдЧрд╛ред рд╣рдордиреЗ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╡рдзрд╛рди рдХрд┐рдпрд╛ рд╣реИред

рдкрд░реАрдХреНрд╖рдг рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдВ - рдФрд░ ...
рдлрд┐рд░, рдПрдХ рдЧрд▓рддреА?
рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ, рдбреЗрдЯрд╛ рд╣реИ ... рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?
рдЖрдзрд╛рд░ рдПрдХ рд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдмрдиреА рд╣реБрдИ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ ... рдФрд░ рдЕрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣рд┐рд╕реНрд╕рд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЗрди рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╣рдЯрд╛рдПрдВ? рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд╣рдЯрд╛рдПрдВ, рд╕рднреА рдЗрдВрдбреЗрдХреНрд╕ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ?

рд╕реНрдиреИрдкрд╢реЙрдЯ: Snap_5_ContextCrafting рддреИрдпрд╛рд░ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, DAL - рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рд▓реЗрдпрд░ рд▓рд┐рдЦреЗрдВред

HabrDBContext_Data.cs рдлрд╝рд╛рдЗрд▓ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдПрдБ, рдЗрд╕реЗ HabrDBContext_DAL.cs рдХрд╣реЗрдВ
рдФрд░ рдЗрд╕рдореЗрдВ рд▓рд┐рдЦреЗрдВ:

 using HabrDB.DBClasses; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Threading.Tasks; namespace HabrDB { public partial class HabrDBContext:DbContext { public async Task<int> AddPhone(Phone ph) { this.Phones.Add(ph); int res = await this.SaveChangesAsync(); return res; } public async Task<List<Phone>> GetAllPhones() { List<Phone> phones = await this.Phones.ToListAsync(); return phones; } } } 

рдпрд╣ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИред рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдХреБрдЫ рдмрджрд▓реВрдВ, рддреЛ рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЦреЛрдЬ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рд▓реЗрдпрд░ рдмрдирд╛рдПрдВрдЧреЗ - рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рд▓реЗрдпрд░ред рд╡рд╣ рд╕рд╛рдЗрдЯ рдпрд╛ рдЕрдиреНрдп рддрдВрддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдФрд░ рдПрдорд╡реАрд╕реА рддрдВрддреНрд░ рдХреЗ рдмреАрдЪ рдордзреНрдпрд╕реНрде рд╣реЛрдЧрд╛ред рдФрд░ - рдПрдХ рд╕рдВрдпреЛрдЧ? - рд╣рдо рддреБрд░рдВрдд рдкрд░реАрдХреНрд╖рдг рд╡рд╕реНрддреБрдУрдВ рд╣реИ! рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдиреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдХрдо рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╡рд╛рд▓реЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рднрдбрд╝рдХрд╛рддреЗ рд╣реИрдВред
рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдмрджрд▓реЗрдВ - рдФрд░ рдПрдХ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВред рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ!
рдПрдХ рдлреЛрди рдЬреЛрдбрд╝рдирд╛!

рд╣рдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдПрдХ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдирд┐рд░рд░реНрдердХ рд╕рдорд╛рдзрд╛рди рд╣реИред
рдЖрдо рддреМрд░ рдкрд░, рдЖрдк рд╕рдм рдХреБрдЫ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдореЗрдВ рдбреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдмрд╣реБрдд рднреНрд░рд╛рдордХ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ

рдирдпрд╛ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб:

 [TestMethod] public void AddPhone_Test() { String PhoneName = "Nokia"; DateTime now = DateTime.Now; HabrDBContext db = new HabrDBContext().CreateTestContext(); db.Database.EnsureCreated(); List<Phone> Phones = db.GetAllPhones().Result; Assert.AreEqual(0, Phones.Count); Phone ph = new Phone(); ph.Model = PhoneName; ph.DayZero = now; db.AddPhone(ph); Phone ph1 = db.Phones.Single(); Assert.AreEqual(PhoneName, ph1.Model); Assert.AreEqual(now, ph1.DayZero); } 

рд╣рдо рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдлреЛрди рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдВрдЧреЗ - рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рдЕрд▓рдЧ рдкреИрд░ рд╣реИред рдореЗрд░реЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╣рд░рд╛ рд╣реИ:

рдЫрд╡рд┐

db.GetAllPhones () рдХреНрдпрд╛ рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдбреАрдПрдПрд▓ рдлрд╝рдВрдХреНрд╢рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЖрдЗрдП рдбреЗрдЯрд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рд╡рд┐рдзрд┐ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрдирд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдПрдХ async рдХрд╛рд░реНрдп рдмрди рдЧрдпрд╛ рд╣реИ - рдЕрдиреНрдпрдерд╛ рдкрд░реАрдХреНрд╖рдг рдЕрднреА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдФрд░ рдЬрд╣рд╛рдВ рдХрд╣реАрдВ рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╣реИ - рдЖрдкрдХреЛ рдЙрдирдХреЗ рд╕рд╛рдордиреЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

 [TestMethod] public async Task AddPhone_Test() { String PhoneName = "Nokia"; DateTime now = DateTime.Now; HabrDBContext db = new HabrDBContext().CreateTestContext(); db.Database.EnsureCreated(); List<Phone> Phones = await db.GetAllPhones(); Assert.AreEqual(0, Phones.Count); Phone ph = new Phone(); ph.Model = PhoneName; ph.DayZero = now; await db.AddPhone(ph); Phone ph1 = db.Phones.Single(); Assert.AreEqual(PhoneName, ph1.Model); Assert.AreEqual(now, ph1.DayZero); } 

рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬрд┐рдирдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рд╣реИрдВ, рдЯрд╛рд╕реНрдХ рд▓реМрдЯрд╛рдПрдВ рдФрд░ рд╢реВрдиреНрдп рдирд╣реАрдВ - рдЕрдиреНрдпрдерд╛ рдкрд░реАрдХреНрд╖рдг рдпрд╛ рддреЛ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред

рддреЛ, рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕реНрдиреИрдкрд╢реЙрдЯ: рд╕реНрдиреИрдк_6_рдбрд╛рд▓

рдФрд░ рдХреНрдпрд╛, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рд╣рдЯрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ ? рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ!

рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...

рдпрд╣ db.Database.EnsureDeleted ... рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ ... рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ!

рд▓реЗрдХрд┐рди рдмреЗрд╣рддрд░ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ ... рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЖрдзрд╛рд░ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗ рдирд╣реАрдВ рдЬреБрдбрд╝реЗ рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - SQL рдкреНрд░рдмрдВрдзрди рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдФрд░ рдЬрдм рдЖрдк рдЗрд╕реЗ db.Database.EnsureDeleted рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рд╕рднреА рдкрд╛рд╕рд╡рд░реНрдб, рдПрдХреНрд╕реЗрд╕, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЬрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдЕрдЧрд▓реА рдмрд╛рд░ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рддрдм рдмрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЖрдкрдХреЛ рдирдП рд╕рд┐рд░реЗ рд╕реЗ рд╕рдм рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рдкрд╣рд▓рд╛ рд╣реИред

рджреВрд╕рд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рдо рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░реАрдХреНрд╖рдг рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрдВрдЧреЗ рдЬреЛ рдмрд╛рд╣рд░реА рддрдВрддреНрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рд╕рднреА рд╕рдВрднрд╡ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рд╕рдордп рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдФрд░ рддреАрд╕рд░рд╛: рд╢рд╛рдпрдж рдПрдХ рдЯреЗрд╕реНрдЯ рдореЗрдВ рд╣рдореЗрдВ рдХреБрдЫ рдЯреЗрдмрд▓ рдпрд╛ рдХрдИ рдмрд╛рд░ рдбрд┐рд▓реАрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рджреВрд╕рд░реЗ рдЯреЗрдмрд▓ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддреЗ рд╣реБрдП рдЗрд╕реЗ рджреЛрдмрд╛рд░рд╛ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

рдЖрдЗрдП db.Database.EnsureDeleted рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдмреНрд░реИрдХреЗрдЯ рдХреЛ рджрдмрд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рдЕрдзрд┐рднрд╛рд░ рд╣реИ ...

рдЫрд╡рд┐

рд╣рд╛рдБ, рдмрд╣реБрдд рдирд╣реАрдВ ...
рдЕрдЪреНрдЫрд╛, рдареАрдХ рд╣реИ, рд╣рдо рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рддреБрд░рдВрдд рд╕рд╣реА рдмрдЯрди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди рдкрд░ рд╕рдорд╛рдзрд╛рди рдореЗрдВ (рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╣реА) рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝реЗрдВ, -> .net рдорд╛рдирдХ C # рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЗрд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреНрд╕ рдХрд╣реЗрдВред рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ 2.1 рд╕рдВрд╕реНрдХрд░рдг рдерд╛ред

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ DBContextExtensions.cs рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдбрд╛рд▓реЗрдВ:

 using Microsoft.EntityFrameworkCore; using System; using System.Linq; using Microsoft.EntityFrameworkCore.Infrastructure; namespace Extensions { public static class DBContextExtensions { public static int EnsureDeleted<TEntity>(this DatabaseFacade db, DbSet<TEntity> set) where TEntity : class { TableDescription Table = GetTableName(set); int res = 0; try { res = db.ExecuteSqlRaw($"DROP TABLE [{Table.Schema}].[{Table.TableName}];"); } catch (Exception) { } return res; } public static TableDescription GetTableName<T>(this DbSet<T> dbSet) where T : class { var dbContext = dbSet.GetDbContext(); var model = dbContext.Model; var entityTypes = model.GetEntityTypes(); var entityType = entityTypes.First(t => t.ClrType == typeof(T)); var tableNameAnnotation = entityType.GetAnnotation("Relational:TableName"); var tableSchemaAnnotation = entityType.GetAnnotation("Relational:Schema"); var tableName = tableNameAnnotation.Value.ToString(); var schemaName = tableSchemaAnnotation.Value.ToString(); return new TableDescription { Schema = schemaName, TableName = tableName }; } public static DbContext GetDbContext<T>(this DbSet<T> dbSet) where T : class { var infrastructure = dbSet as IInfrastructure<IServiceProvider>; var serviceProvider = infrastructure.Instance; var currentDbContext = serviceProvider.GetService(typeof(ICurrentDbContext)) as ICurrentDbContext; return currentDbContext.Context; } } public class TableDescription { public String Schema { get; set; } public String TableName { get; set; } } } 

Nuget рд╕реЗ Microsoft.EntityFrameworkCore рдЬреЛрдбрд╝реЗрдВред
рдФрд░ рджреВрд╕рд░рд╛ рдкреИрдХреЗрдЬ, Microsoft.EntityFrameworkCore.Relational

рдПрдХреНрд╕рдЯреЗрдВрд╢рди, рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдВрддреНрд░ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдордиреЗ рдХрд┐рдпрд╛ рдерд╛ - рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдХреАрд╡рд░реНрдб

 public static int EnsureDeleted<TEntity>(this DatabaseFacade db, DbSet<TEntity> set) where TEntity : class 

рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рд╣рдордиреЗ рдЗрд╕реЗ рд▓рд┐рдЦрд╛ рдерд╛, рддреЛ рдбреЗрдЯрд╛рдмреЗрд╕рдлреЗрдХрдбреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрд╛рд╕ рдПрдХ рдирдпрд╛ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ - рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ, рдЬреЛ рд╣рдорд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдордиреЗ рдЕрднреА рд▓рд┐рдЦрд╛ рдерд╛! рдЬрд╣рд╛рдВ TEntity: рдЕрдВрдд рдореЗрдВ рд╡рд░реНрдЧ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ TEntity рдореЗрдВ рдмрд╛рдзрд╛ рд╣реИ - рдЙрдкрдпреЛрдЧ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз, рдФрд░ рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рдПрдХ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХреБрдЫ рдФрд░ рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред

рдореИрдВ рдЖрдкрдХреЗ рддрд╛рд░реНрдХрд┐рдХ рд╕рд╡рд╛рд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ - рдпрд╣ рдХреНрдпреЛрдВ рд╣реИ?

рдлрд┐рд░, GetTableName рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ EnsureDeleted рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕реЗ рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЙрд╕реЗ рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдлрд┐рд░, GetDbContext рдХреЛ рдХреНрдпрд╛ рдХрд╛рд░реНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ GetTableName рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛ рднреА рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...

рдФрд░ рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ ??? !!! рдЖрдк рдКрдВрдЪреЗ рд╕реНрд╡рд░ рдореЗрдВ рдкреВрдЫрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рд╕рд╣реА рд╣реЛрдВрдЧреЗ ...

DbSet рд╣рдо рд▓рд╛рдЗрди рдореЗрдВ GetDbContext рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

 Public static DbContext GetDbContext<T>(this DbSet<T> dbSet) where T : class 

, рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЯреА рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд╣реЛ, рдФрд░ рдХрдХреНрд╖рд╛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ ...

рдЗрд╕рд▓рд┐рдП, рдЗрди рд╕рднреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ - рдПрдХ рдЫреЛрдЯреА рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП - рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдХрд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рди рдХрд░реЗрдВред рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЦрд░рд╛рдм рдореЗрдореЛрд░реА рд╣реИред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ DBContext рдореБрдЭреЗ рдмрддрд╛рдП рдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреМрди рд╕реА рдЯреЗрдмрд▓ рд╣реИ, рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛рд╕реЗрдЯ рд╕реЗ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрджрд░реНрдн рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╡рд╣ рдЗрд╕ рд╕рдВрджрд░реНрдн рд╕реЗ рдореЙрдбрд▓ рд▓реЗрддрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рд╡рд╣ рдЯрд╛рдЗрдк рдЦреЛрдЬрддрд╛ рд╣реИ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреА рддрд░рд╣ рд╣реА (рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдЧреЗрдЯрдЯреЗрдмрд▓рдирд╛рдо рдореЗрдВ рд╣реИ), рдлрд┐рд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рдЯреЗрдмрд▓ рдФрд░ рд╕реНрдХреАрдорд╛ рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд╢реНрдпреБрд░реЗрдбрд▓реЗрдЯ рдореЗрдВ рднреЗрдЬ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдБ - рдзрд┐рдХреНрдХрд╛рд░ рд╣реИ! рдлрд┐рд░ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдпреЛрдЧреНрдп рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬреИрд╕реЗ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЖрдкрдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╕реЗ рдХреБрдЫ рдПрд╕рдХреНрдпреВрдПрд▓ рд╕рд┐рд░реНрдирд┐рдХреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ... рдареАрдХ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛!

рдФрд░ рдЕрдкрд╡рд╛рдж EnsureDeleted рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХреЗрдВ, рдпрджрд┐ рдХреЛрдИ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рд╡рд╣рд╛рдВ рд╣реИрдВ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рдкрд░реЗрд╢рд╛рди рди рдХрд░реЗрдВред

рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ (рдЕрдВрдд рдореЗрдВ)

 [TestMethod] public void DeleteTable_Test() { HabrDBContext db = new HabrDBContext().CreateTestContext(); db.Database.EnsureDeleted(db.Phones); } 

рднрд╛рдЧреЛ, рдЪреЗрдХ рдХрд░реЛ, рд╕рд╛рдБрд╕ рдЫреЛрдбрд╝реЛ ...
рдлрд┐рд░ рд╕реЗ рднрд╛рдЧреЛ - рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдм, рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрд╡рд╢реНрдпрдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕реНрдиреИрдкрд╢реЙрдЯ: Snap_7_Extensions

рдирдИ рдмрд╡рд╛рд╕реАрд░ рдХреНрд╖рд┐рддрд┐рдЬ

рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ - (рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рд╛ рдкрджреНрдзрддрд┐ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛) HabrDBContext рд╡рд╕реНрддреБ рд╣рдо рд▓рдЧрд╛рддрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред (рдареАрдХ рд╣реИ, рд╣рд╛рдБ, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ KGB рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рдФрд░ рд╣рдо рдЗрд╕реЗ рддреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ! рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдкреБрд▓рд┐рд╕ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦреЗ ...)

рдЕрд░реНрдерд╛рддреН, рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдореЗрдВ, рд╕рдВрджрд░реНрдн рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЖрдо рд╣реЛ рдФрд░ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдХреНрдпрд╛ рд╣рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ? рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред

 HabrDBContext db = new HabrDBContext().CreateTestContext(); db.Database.EnsureCreated(); 

рдФрд░ рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдУ

 HabrDBContext db = new HabrDBContext().CreateTestContext(); db.Database.EnsureDeleted(db.Phones); 

рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рддрд╛рд▓рд┐рдХрд╛рдУрдВ ...

рдпрд╣ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ ... рдЪреВрдВрдХрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдХреЛрдВ рдХреА рддрд░рд╣ рдХрдкрдбрд╝реЗ рдкрд╣рдирддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЫрд╡рд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╣рдо рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ!

рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдРрд╕реА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпред

рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдЕрдЧрд░ рдЖрдк рдПрдХ рдбреНрд░рд╛рдЗрдВрдЧ рдФрд░ рдЗрд╕ рдбреНрд░рд╛рдЗрдВрдЧ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдПрдХ рд╡рд╕реНрддреБ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдп рдПрдХ рд╕рджрд╕реНрдп рд╣реИ рдЬреЛ рдбреНрд░рд╛рдЗрдВрдЧ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрд╡рдпрдВ рдбреНрд░рд╛рдЗрдВрдЧ рд╣реИред

рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ ...
рдЕрдм рдЪрд▓реЛ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ!

рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ рдХреЛ DBTest рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ - db

 using HabrDB; using HabrDB.DBClasses; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Extensions; namespace DBTest { [TestClass] public class DBTest { public static HabrDBContext db; [TestMethod] public void AA0_init() { db = new HabrDBContext().CreateTestContext(); db.Database.EnsureCreated(); } [TestMethod] public async Task AddPhone_Test() { String PhoneName = "Nokia"; DateTime now = DateTime.Now; List<Phone> Phones = await db.GetAllPhones(); Assert.AreEqual(0, Phones.Count); Phone ph = new Phone(); ph.Model = PhoneName; ph.DayZero = now; await db.AddPhone(ph); Phone ph1 = db.Phones.Single(); Assert.AreEqual(PhoneName, ph1.Model); Assert.AreEqual(now, ph1.DayZero); } [TestMethod] public void DeleteTable_Test() { db.Database.EnsureDeleted(db.Phones); } } } 

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рд▓реЗрдХрд┐рди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрдЦреНрдпрд╛ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╡рдХреВрдл рд╣реИред
рдПрдХ рдЙрдкрд╛рдп рд╣реИ!
рд╡рд┐рд╢реЗрд╖ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ!
рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, DBTestBase рдирд╛рдордХ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ, рдФрд░ рд╣рдорд╛рд░реЗ DBTest рд╡рд░реНрдЧ рдХреЛ рдЙрд╕рдореЗрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
DBTest рд╕реЗ рдЖрдкрдХреЛ рд╕рд┐рд╡рд╛рдп рд╕рдм рдХреБрдЫ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 using HabrDB; using HabrDB.DBClasses; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Extensions; namespace DBTest { [TestClass] public class DBTest:DBTestBase { [TestMethod] public async Task AddPhone_Test() { String PhoneName = "Nokia"; DateTime now = DateTime.Now; List<Phone> Phones = await db.GetAllPhones(); Assert.AreEqual(0, Phones.Count); Phone ph = new Phone(); ph.Model = PhoneName; ph.DayZero = now; await db.AddPhone(ph); Phone ph1 = db.Phones.Single(); Assert.AreEqual(PhoneName, ph1.Model); Assert.AreEqual(now, ph1.DayZero); } [ClassCleanup] public static void DeleteTable() { db.Database.EnsureDeleted(db.Phones); } } } 

DBTestBase рд╡рд░реНрдЧ рдХреА рд╕рд╛рдордЧреНрд░реА:

 using HabrDB; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace DBTest { [TestClass] public class DBTestBase { public static HabrDBContext db{ get; set; } /// <summary> /// Executes once before the test run. (Optional) /// </summary> /// <param name="context"></param> [AssemblyInitialize] public static void AssemblyInit(TestContext context) { db = new HabrDBContext().CreateTestContext(); db.Database.EnsureCreated(); } /// <summary> /// Executes before this class creation /// </summary> /// <param name="context"></param> [ClassInitialize] public static void TestFixtureSetup(TestContext context) { } /// <summary> /// Executes Before each test /// </summary> [TestInitialize] public void Setup() { } /// <summary> /// Executes once after the test run /// </summary> [AssemblyCleanup] public static void AssemblyCleanup() { } /// <summary> /// Runs once after all tests in this class are executed. /// Not guaranteed that it executes instantly after all tests from the class. /// </summary> [ClassCleanup] public static void TestFixtureTearDown() { } /// <summary> /// Executes after each test /// </summary> [TestCleanup] public void TearDown() { //db.Database.EnsureDeleted();//don`t call! delete database instead of tables! } } } 

рдЕрдм рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ! рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ DBTestBase рд╡рд░реНрдЧ рдХреЗ рдПрдХ рд╕реНрдерд┐рд░ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдпрд╣ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордпред

[ClassCleanup] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреА рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ - рдФрд░ "рдХреНрд▓реАрдирд░" рдкрд░реАрдХреНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ - рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреБрдЫ рдХрд░реЗрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕реНрдкрд░реНрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред

рдЪреВрдВрдХрд┐ рдЗрди рд╕рднреА рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрд╕ рд╕рд╛рдл рд╕рдордп рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рдмрд╣реБрдд рд╕реА рдмрд╛рдИрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдирдореВрдирд╛рдХрд░рдг рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдХрд╛рд░реНрдп рд╕рдордп рдореЗрдВ рддреЗрдЬ рд╡реГрджреНрдзрд┐ рджреЗрдЦрддреЗ рд╣реИрдВ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдбреАрдПрдПрд▓ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдореЗрдВ, рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛рдВ рд╣реИред

рдЖрдк рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рддреИрдпрд╛рд░реА рдлрд╝рдВрдХреНрд╢рди (рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдлрд┐рд░ DAL рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ рдФрд░ DAL рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╕реЛрдЪрддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕ рдбреЗрдЯрд╛ рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдирдХрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рдкрд░реАрдХреНрд╖рдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдереИрддрд┐рдХ рдЕрдиреБрдХреНрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

T1_AddPhone_Test,
T2_RemovePhone_Test,
рдЖрджрд┐ ...

рдЦреИрд░, рдЕрдм рдЖрдк рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛!
рдФрд░ рдЕрдм рд╕реЛрдиреЗ рдХрд╛ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ! рдореИрдВ рдЕрднреА рднреА рд╡рд╣рд╛рдБ рдПрдХ рд▓рдбрд╝рдХреА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ ...

рд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг! рд╕рдмрдХреЛ рдмрд╛рдп!

рдЧрд┐рдЯ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ: https://github.com/3263927/Habr_1

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдпрджрд┐ рдпрд╣ рд╡рд┐рд╖рдп рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдореИрдВ рдкрд╣рдЪрд╛рди, рд░реЛрд▓реНрд╕, рджрд╛рд╡реЗ, 3 рдбреА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдЯрд╛рдЗрдкрдлрд╝рд┐рд▓реНрдЯрд░рдПрдЯреНрд░реАрдмреНрдпреВрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦреВрдВрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдорд╛рдирдХ рдПрдХ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рднреВрдорд┐рдХрд╛ рд╕реЗ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдХреА рд╢рд╛рджреА рд╣реЛрдиреЗ рддрдХ рдпрд╣ рднреВрдорд┐рдХрд╛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рд░рд╣реЗрдЧреАред рдФрд░ MARRIAGE рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ UNTIL рд╕реЗ рдЯрдХрд░рд╛ рдЧрдпрд╛ рд╣реЛ !: /)

рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рдХреА
рдЫрд╡рд┐

Source: https://habr.com/ru/post/hi481474/


All Articles