实体属性

NUGET安装 MySql.Data.EntityFrameworkCore

创建表、

DROP TABLE IF EXISTS `blogs`;
CREATE TABLE `blogs` (
  `BlogId` int(11) NOT NULL AUTO_INCREMENT,
  `Url` varchar(255) DEFAULT NULL,
  `Rating` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`BlogId`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


DROP TABLE IF EXISTS `posts`;
CREATE TABLE `posts` (
  `PostId` int(11) NOT NULL AUTO_INCREMENT,
  `Title` varchar(255) DEFAULT NULL,
  `Content` varchar(255) DEFAULT NULL,
  `BlogId` int(11) DEFAULT NULL,
  PRIMARY KEY (`PostId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;Code language: PHP (php)

执行数据库

class Program
    {
        static void Main(string[] args)
        {
            using (var db = new BloggingContext())
            {
                var blog = new Blog { Url = "http://bamn.cn", Rating = 9 };
                db.Blogs.Add(blog);
                db.SaveChanges();

                var blog = db.Blogs.Include(blog => blog.Posts)
                    .Where(b => b.Rating > 3)
                    .OrderBy(b => b.Url)
                    .first(m=>m.blogid = 1);
                    
                        foreach(var item in blog.posts){
                            
                        }
            }
        }
    }

    public class BloggingContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySQL(
                @"server=localhost;Database=web;Uid=root;Pwd=123456");
        }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }
        public int Rating { get; set; }
        public List<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        public int BlogId { get; set; }
        public Blog Blog { get; set; }
         public Author Author { get; set; }
    }
    
    public class Author
    {
        public Photo Photo{ get; set; }
    }
    
    public class Photo
    {
        
    }Code language: HTML, XML (xml)

就整理 不要改动一个字

从模型中排除类型

如果您不希望在模型中包含某一类型,则可以排除它:

两种方法

标注的方式

[NotMapped]
public class BlogMetadata
{
    public DateTime LoadedFromDatabase { get; set; }
}Code language: JavaScript (javascript)

API的方式

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Ignore<BlogMetadata>();
}Code language: HTML, XML (xml)

表名

按照约定,每个实体类型将设置为映射到与公开实体的 DbSet 属性同名的数据库表。 如果给定实体不存在 DbSet,则使用类名称。

可以手动配置表名:

标注的方式

[Table("blogs")]
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}Code language: JavaScript (javascript)

API的方式

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .ToTable("blogs");
}Code language: JavaScript (javascript)

模型中的每个实体类型都具有一组属性,这些属性 EF Core 将从数据库中读取和写入数据。 如果使用关系数据库,实体属性将映射到表列。

包含和排除的属性

按照约定,具有 getter 和 setter 的所有公共属性都将包括在模型中。

可以按如下所述排除特定属性:

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    [NotMapped]
    public DateTime LoadedFromDatabase { get; set; }
}Code language: JavaScript (javascript)

或者

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Ignore(b => b.LoadedFromDatabase);
}Code language: JavaScript (javascript)

列名

按照约定,使用关系数据库时,实体属性映射到与属性同名的表列。

如果希望使用不同的名称配置列,可以执行以下操作:

public class Blog
{
    [Column("blog_id")]
    public int BlogId { get; set; }
    public string Url { get; set; }
}Code language: JavaScript (javascript)
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.BlogId)
        .HasColumnName("blog_id");
}Code language: JavaScript (javascript)

列数据类型

使用关系数据库时,数据库提供程序根据属性的 .NET 类型选择数据类型。 它还会考虑其他元数据,如配置的最大长度、属性是否是主键的一部分等。

例如,SQL Server 将 DateTime 属性映射到 datetime2(7) 列,并将 string 属性映射到 nvarchar(max) 列(或用于 nvarchar(450) 用作键的属性)。

您还可以配置列,以便为列指定精确的数据类型。 例如,下面的代码将 Url 配置为具有最大长度的非 unicode 字符串 200 并将 Rating 为 decimal,精度为 5,小数位数为 2:

public class Blog
{
    public int BlogId { get; set; }
    [Column(TypeName = "varchar(200)")]
    public string Url { get; set; }
    [Column(TypeName = "decimal(5, 2)")]
    public decimal Rating { get; set; }
}Code language: JavaScript (javascript)

或者

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>(eb =>
    {
        eb.Property(b => b.Url).HasColumnType("varchar(200)");
        eb.Property(b => b.Rating).HasColumnType("decimal(5, 2)");
    });
}Code language: JavaScript (javascript)

最大长度

配置最大长度会向数据库提供程序提供有关要为给定属性选择的相应列数据类型的提示。 最大长度仅适用于数组数据类型,如 string 和 byte[]。

在下面的示例中,配置最大长度为500将导致在 SQL Server 上创建 nvarchar(500) 类型的列

public class Blog
{
    public int BlogId { get; set; }
    [MaxLength(500)]
    public string Url { get; set; }
}Code language: JavaScript (javascript)

或者

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Url)
        .HasMaxLength(500);
}Code language: JavaScript (javascript)

必需属性和可选属性

如果属性对于包含 null是有效的,则认为该属性是可选的。 如果 null 不是要分配给属性的有效值,则将其视为必需属性。 映射到关系数据库架构时,必需的属性将创建为不可为 null 的列,而可选属性则创建为可以为 null 的列。

public class Blog
{
    public int BlogId { get; set; }
    [Required]
    public string Url { get; set; }
}Code language: JavaScript (javascript)

或者

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Url)
        .IsRequired();
}Code language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注