کوئری نویسی در EF Core - قسمت اول - تشکیل بانک اطلاعاتی و مقدار دهی اولیهی آن
نویسنده: وحید نصیری
تاریخ: ۱۳۹۹/۰۵/۰۵ ۱۵:۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
CREATE TABLE cd.members
(
memid integer NOT NULL,
surname character varying(200) NOT NULL,
firstname character varying(200) NOT NULL,
address character varying(300) NOT NULL,
zipcode integer NOT NULL,
telephone character varying(20) NOT NULL,
recommendedby integer,
joindate timestamp not null,
CONSTRAINT members_pk PRIMARY KEY (memid),
CONSTRAINT fk_members_recommendedby FOREIGN KEY (recommendedby)
REFERENCES cd.members(memid) ON DELETE SET NULL
); CREATE TABLE cd.facilities
(
facid integer NOT NULL,
name character varying(100) NOT NULL,
membercost numeric NOT NULL,
guestcost numeric NOT NULL,
initialoutlay numeric NOT NULL,
monthlymaintenance numeric NOT NULL,
CONSTRAINT facilities_pk PRIMARY KEY (facid)
); CREATE TABLE cd.bookings
(
bookid integer NOT NULL,
facid integer NOT NULL,
memid integer NOT NULL,
starttime timestamp NOT NULL,
slots integer NOT NULL,
CONSTRAINT bookings_pk PRIMARY KEY (bookid),
CONSTRAINT fk_bookings_facid FOREIGN KEY (facid) REFERENCES cd.facilities(facid),
CONSTRAINT fk_bookings_memid FOREIGN KEY (memid) REFERENCES cd.members(memid)
);
namespace EFCorePgExercises.Entities
{
public class Member
{
public int MemId { set; get; }
public string Surname { set; get; }
public string FirstName { set; get; }
public string Address { set; get; }
public int ZipCode { set; get; }
public string Telephone { set; get; }
public virtual ICollection<Member> Children { get; set; }
public virtual Member Recommender { set; get; }
public int? RecommendedBy { set; get; }
public DateTime JoinDate { set; get; }
public virtual ICollection<Booking> Bookings { set; get; }
}
} namespace EFCorePgExercises.Entities
{
public class Facility
{
public int FacId { set; get; }
public string Name { set; get; }
public decimal MemberCost { set; get; }
public decimal GuestCost { set; get; }
public decimal InitialOutlay { set; get; }
public decimal MonthlyMaintenance { set; get; }
public virtual ICollection<Booking> Bookings { set; get; }
}
} namespace EFCorePgExercises.Entities
{
public class Booking
{
public int BookId { set; get; }
public int FacId { set; get; }
public virtual Facility Facility { set; get; }
public int MemId { set; get; }
public virtual Member Member { set; get; }
public DateTime StartTime { set; get; }
public int Slots { set; get; }
}
} namespace EFCorePgExercises.Entities
{
public class MemberConfiguration : IEntityTypeConfiguration<Member>
{
public void Configure(EntityTypeBuilder<Member> builder)
{
builder.HasKey(member => member.MemId);
builder.Property(member => member.MemId).IsRequired().UseIdentityColumn(seed: 0, increment: 1);
builder.Property(member => member.Surname).HasMaxLength(200).IsRequired();
builder.Property(member => member.FirstName).HasMaxLength(200).IsRequired();
builder.Property(member => member.Address).HasMaxLength(300).IsRequired();
builder.Property(member => member.ZipCode).IsRequired();
builder.Property(member => member.Telephone).HasMaxLength(20).IsRequired();
builder.HasIndex(member => member.RecommendedBy);
builder.HasOne(member => member.Recommender)
.WithMany(member => member.Children)
.HasForeignKey(member => member.RecommendedBy);
builder.Property(member => member.JoinDate).IsRequired();
builder.HasIndex(member => member.JoinDate).HasName("IX_JoinDate");
builder.HasIndex(member => member.RecommendedBy).HasName("IX_RecommendedBy");
}
}
} namespace EFCorePgExercises.Entities
{
public class FacilityConfiguration : IEntityTypeConfiguration<Facility>
{
public void Configure(EntityTypeBuilder<Facility> builder)
{
builder.HasKey(facility => facility.FacId);
builder.Property(facility => facility.FacId).IsRequired().UseIdentityColumn(seed: 0, increment: 1);
builder.Property(facility => facility.Name).HasMaxLength(100).IsRequired();
builder.Property(facility => facility.MemberCost).IsRequired().HasColumnType("decimal(18, 6)");
builder.Property(facility => facility.GuestCost).IsRequired().HasColumnType("decimal(18, 6)");
builder.Property(facility => facility.InitialOutlay).IsRequired().HasColumnType("decimal(18, 6)");
builder.Property(facility => facility.MonthlyMaintenance).IsRequired().HasColumnType("decimal(18, 6)");
}
}
} namespace EFCorePgExercises.Entities
{
public class BookingConfiguration : IEntityTypeConfiguration<Booking>
{
public void Configure(EntityTypeBuilder<Booking> builder)
{
builder.HasKey(booking => booking.BookId);
builder.Property(booking => booking.BookId).IsRequired().UseIdentityColumn(seed: 0, increment: 1);
builder.Property(booking => booking.FacId).IsRequired();
builder.HasOne(booking => booking.Facility)
.WithMany(facility => facility.Bookings)
.HasForeignKey(booking => booking.FacId);
builder.Property(booking => booking.MemId).IsRequired();
builder.HasOne(booking => booking.Member)
.WithMany(member => member.Bookings)
.HasForeignKey(booking => booking.MemId);
builder.Property(booking => booking.StartTime).IsRequired();
builder.Property(booking => booking.Slots).IsRequired();
builder.HasIndex(booking => new { booking.MemId, booking.FacId }).HasName("IX_memid_facid");
builder.HasIndex(booking => new { booking.FacId, booking.StartTime }).HasName("IX_facid_starttime");
builder.HasIndex(booking => new { booking.MemId, booking.StartTime }).HasName("IX_memid_starttime");
builder.HasIndex(booking => booking.StartTime).HasName("IX_starttime");
}
}
} namespace EFCorePgExercises.DataLayer
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions options)
: base(options)
{
}
public DbSet<Member> Members { get; set; }
public DbSet<Booking> Bookings { get; set; }
public DbSet<Facility> Facilities { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof(MemberConfiguration).Assembly);
}
}
} dotnet tool install --global dotnet-ef --version 3.1.6 dotnet tool update --global dotnet-ef --version 3.1.6 dotnet build dotnet ef migrations add Init --context ApplicationDbContext
context.Facilities.Add(new Facility { Name = "Tennis Court 1", MemberCost = 5, GuestCost = 25, InitialOutlay = 10000, MonthlyMaintenance = 200 });
// مابقی موارد
context.SaveChanges(); context.Members.Add(new Member { ... });
context.SaveChanges(); // For id = 0 = Int's CLR Default Value! using (var transaction = context.Database.BeginTransaction())
{
try
{
context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Members ON");
context.Members.Add(new Member { ... });
// مابقی موارد
context.SaveChanges();
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
finally
{
context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Members OFF");
}
}