شروع به کار با EF Core 1.0 - قسمت 5 - استراتژهای تعیین کلید اصلی جداول و ایندکسها
نویسنده: وحید نصیری
تاریخ: ۱۳۹۵/۰۵/۳۰ ۱۵:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public class Car
{
public string Id { get; set; } public class Car
{
public string CarId { get; set; } public class Car
{
[Key]
public string LicensePlate { get; set; } public class MyContext : DbContext
{
public DbSet<Car> Cars { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasKey(c => c.LicensePlate);
}
} {
"dependencies": {
"System.ComponentModel.Annotations": "4.1.0"
}
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasKey(c => new { c.State, c.LicensePlate });
} public class Blog
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int BlogId { get; set; }
public string Url { get; set; }
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.BlogId)
.ValueGeneratedNever();
} public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime Inserted { get; set; }
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Inserted)
.ValueGeneratedOnAdd();
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Inserted)
.HasDefaultValueSql("getdate()");
} public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime LastUpdated { get; set; }
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.LastUpdated)
.ValueGeneratedOnAddOrUpdate();
} public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string DisplayName { get; set; }
}
public class MyContext : DbContext
{
public DbSet<Person> People { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.Property(p => p.DisplayName)
.HasComputedColumnSql("[LastName] + ', ' + [FirstName]");
}
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared")
.StartsAt(1000).IncrementsBy(5);
modelBuilder.Entity<Order>()
.Property(o => o.OrderNo)
.HasDefaultValueSql("NEXT VALUE FOR shared.OrderNumbers");
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasSequence<int>("PrimaryKeyWithSequenceSequence");
modelBuilder.Entity<PrimaryKeyWithSequence>(entity =>
{
entity.Property(e => e.PrimaryKeyWithSequenceId).HasDefaultValueSql("NEXT VALUE FOR [PrimaryKeyWithSequenceSequence]");
});
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasIndex(b => b.Url)
.HasName("Index_Url"); modelBuilder.Entity<Blog>().HasIndex(b => b.Url).HasName("Index_Url").IsUnique(); modelBuilder.Entity<Person>()
.HasIndex(idx => new { idx.FirstName, idx.LastName })
.IsUnique(); protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasAlternateKey(c => c.LicensePlate)
.HasName("AlteranteKey_LicensePlate");
} modelBuilder.Entity<Person>()
.HasAlternateKey(x => new { x.FirstName, x.LastName }); table.UniqueConstraint("AK_Persons_FirstName_LastName", x => new { x.FirstName, x.LastName }); | SomeSequence | ForeignKeyId | Id |
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 1 | 2 | 3 |
| 2 | 2 | 4 |
CREATE TABLE #Table1 ( [Id] [int] IDENTITY(1,1) NOT NULL, [ForeignKeyId] [int] NOT NULL, ) Insert Into #Table1 VALUES (1), (1), (1), (2), (2), (2), (3), (3), (3) Select [Id], [ForeignKeyId] , ROW_NUMBER() OVER(PARTITION BY [ForeignKeyId] ORDER BY [ForeignKeyId]) [SomeSequence] from #Table1 Drop table #Table1
ROW_NUMBER() OVER(PARTITION BY [ForeignKeyId] ORDER BY [ForeignKeyId]) [SomeSequence]
using System;
using System.Linq;
public class Test
{
public static void Main()
{
var beatles = (new[]
{
new {id = 1, inst = "guitar", name = "john"},
new {id = 2, inst = "guitar", name = "george"},
new {id = 3, inst = "guitar", name = "paul"},
new {id = 4, inst = "drums", name = "ringo"},
new {id = 5, inst = "drums", name = "pete"}
});
var result = beatles
.GroupBy(g => g.inst)
.Select(c => c.OrderBy(o => o.id).Select((v, i) => new { i, v }).ToList())
.SelectMany(c => c)
.Select(c => new { c.v.id, c.v.inst, c.v.name, rn = c.i + 1 })
.ToList();
Console.WriteLine("id | inst \t| name \t| rn");
foreach (var row in result)
{
Console.WriteLine($"{row.id} | {row.inst}\t| {row.name} \t| {row.rn}");
}
}
} id | inst | name | rn 1 | guitar| john | 1 2 | guitar| george | 2 3 | guitar| paul | 3 4 | drums| ringo | 1 5 | drums| pete | 2
entity.Property(e => e.SequenceId).HasDefaultValueSql("NEXT VALUE FOR [OrderNumbers]") modelBuilder.HasSequence<int>("OrderNumbers").StartsAt(1000).IncrementsBy(5);
modelBuilder.UseHiLo("OrderNumbers"); entity.Property(p => p.SequenceId).UseHiLo("OrderNumbers"); modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared")
.StartsAt(1000).IncrementsBy(5); modelBuilder.Entity<PrimaryKeyWithSequence>(entity =>
{
entity.Property(e => e.PrimaryKeyWithSequenceId).HasDefaultValueSql("NEXT VALUE FOR [PrimaryKeyWithSequenceSequence]");
}); CREATE TABLE PrimaryKeyWithSequence
(
ID int PRIMARY KEY CLUSTERED
DEFAULT (NEXT VALUE FOR [PrimaryKeyWithSequenceSequence]),
Field1 nvarchar(300) NULL
) ; modelbuilder.HasSequence<int>("DBSequenceHiLo")
.StartsAt(1000).IncrementsBy(5);
modelbuilder.ForSqlServerUseSequenceHiLo("DBSequenceHiLo"); CREATE SEQUENCE [dbo].[DBSequenceHiLo] AS [int] START WITH 1000 INCREMENT BY 5 MINVALUE -2147483648 MAXVALUE 2147483647 CACHE GO
using (var dataContext = new SampleDBContext())
{
dataContext.Categories.Add(new Category() { CategoryName = "Clothing" });
dataContext.Categories.Add(new Category() { CategoryName = "Footwear" });
dataContext.Categories.Add(new Category() { CategoryName = "Accessories" });
dataContext.SaveChanges();
dataContext.Products.Add(new Product() { ProductName = "TShirts" });
dataContext.Products.Add(new Product() { ProductName = "Shirts" });
dataContext.Products.Add(new Product() { ProductName = "Causal Shoes" });
dataContext.SaveChanges();
}
[Index(nameof(Url))]
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
} [Index(nameof(Url), Name = "Index_Url")]
[Index(nameof(FirstName), nameof(LastName))]
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
} [Index(nameof(Url), IsUnique = true)]
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}