From 6716d0e0d4fadc23ed39190d24140cfc02296b0a Mon Sep 17 00:00:00 2001 From: Vladimir Date: Sat, 8 Feb 2020 15:25:55 -0500 Subject: [PATCH] + name value object --- 3_Name_value_object.sql | 17 +++++++++++++ DddAndEFCore.sln | 1 + src/App/Name.cs | 46 ++++++++++++++++++++++++++++++++++++ src/App/SchoolContext.cs | 6 ++++- src/App/Student.cs | 4 ++-- src/App/StudentController.cs | 6 ++--- 6 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 3_Name_value_object.sql create mode 100644 src/App/Name.cs diff --git a/3_Name_value_object.sql b/3_Name_value_object.sql new file mode 100644 index 0000000..d8a95c2 --- /dev/null +++ b/3_Name_value_object.sql @@ -0,0 +1,17 @@ +USE [EFCoreDDD] +GO +BEGIN TRANSACTION +GO +EXECUTE sp_rename N'dbo.Student.Name', N'Tmp_FirstName', 'COLUMN' +GO +EXECUTE sp_rename N'dbo.Student.Tmp_FirstName', N'FirstName', 'COLUMN' +GO +ALTER TABLE dbo.Student ADD + LastName nvarchar(50) NOT NULL CONSTRAINT DF_Student_LastName DEFAULT '' +GO +ALTER TABLE dbo.Student + DROP CONSTRAINT DF_Student_LastName +GO +ALTER TABLE dbo.Student SET (LOCK_ESCALATION = TABLE) +GO +COMMIT diff --git a/DddAndEFCore.sln b/DddAndEFCore.sln index c202584..d096a6a 100644 --- a/DddAndEFCore.sln +++ b/DddAndEFCore.sln @@ -10,6 +10,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .editorconfig = .editorconfig 1_Database_initial.sql = 1_Database_initial.sql 2_Enrollments.sql = 2_Enrollments.sql + 3_Name_value_object.sql = 3_Name_value_object.sql README.md = README.md EndProjectSection EndProject diff --git a/src/App/Name.cs b/src/App/Name.cs new file mode 100644 index 0000000..c642ccb --- /dev/null +++ b/src/App/Name.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using CSharpFunctionalExtensions; + +namespace App +{ + public class Name : ValueObject + { + public string First { get; } + public string Last { get; } + + protected Name() + { + } + + private Name(string first, string last) + : this() + { + First = first; + Last = last; + } + + public static Result Create(string firstName, string lastName) + { + if (string.IsNullOrWhiteSpace(firstName)) + return Result.Failure("First name should not be empty"); + if (string.IsNullOrWhiteSpace(lastName)) + return Result.Failure("Last name should not be empty"); + + firstName = firstName.Trim(); + lastName = lastName.Trim(); + + if (firstName.Length > 200) + return Result.Failure("First name is too long"); + if (lastName.Length > 200) + return Result.Failure("Last name is too long"); + + return Result.Success(new Name(firstName, lastName)); + } + + protected override IEnumerable GetEqualityComponents() + { + yield return First; + yield return Last; + } + } +} diff --git a/src/App/SchoolContext.cs b/src/App/SchoolContext.cs index 8645b55..4cfca9f 100644 --- a/src/App/SchoolContext.cs +++ b/src/App/SchoolContext.cs @@ -49,7 +49,11 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) x.Property(p => p.Id).HasColumnName("StudentID"); x.Property(p => p.Email) .HasConversion(p => p.Value, p => Email.Create(p).Value); - x.Property(p => p.Name); + x.OwnsOne(p => p.Name, p => + { + p.Property(pp => pp.First).HasColumnName("FirstName"); + p.Property(pp => pp.Last).HasColumnName("LastName"); + }); x.HasOne(p => p.FavoriteCourse).WithMany(); x.HasMany(p => p.Enrollments).WithOne(p => p.Student) .OnDelete(DeleteBehavior.Cascade) diff --git a/src/App/Student.cs b/src/App/Student.cs index 7a2f3f3..64e06c5 100644 --- a/src/App/Student.cs +++ b/src/App/Student.cs @@ -5,7 +5,7 @@ namespace App { public class Student : Entity { - public string Name { get; set; } + public virtual Name Name { get; set; } public Email Email { get; set; } public virtual Course FavoriteCourse { get; set; } @@ -17,7 +17,7 @@ protected Student() } public Student( - string name, Email email, Course favoriteCourse, Grade favoriteCourseGrade) + Name name, Email email, Course favoriteCourse, Grade favoriteCourseGrade) : this() { Name = name; diff --git a/src/App/StudentController.cs b/src/App/StudentController.cs index 17e23eb..20523a0 100644 --- a/src/App/StudentController.cs +++ b/src/App/StudentController.cs @@ -74,8 +74,8 @@ public string RegisterStudent( if (result.IsFailure) return result.Error; - var student = new Student(name, result.Value, favoriteCourse, favoriteCourseGrade); - _repository.Save(student); + //var student = new Student(name, result.Value, favoriteCourse, favoriteCourseGrade); + //_repository.Save(student); _context.SaveChanges(); @@ -97,7 +97,7 @@ public string EditPersonalInfo( if (result.IsFailure) return result.Error; - student.Name = name; + //student.Name = name; student.Email = result.Value; student.FavoriteCourse = favoriteCourse;