Loading

FreeSql (四)实体特性 Fluent Api

FreeSql 提供使用 FluentApi, 在外部配置实体的数据库特性,FluentApi 的方法命名与 Attribute 保持一致,如下:

fsql.CodeFirst
    .ConfigEntity<TestFluenttb1>(a => {
        a.Name("table1");
        a.Property(b => b.Id).Name("PkId").IsIdentity(true);
    })
    .ConfigEntity<TestFluenttb2>(a => {
        //...
    });

class TestFluenttb1
{
    public int Id { get; set; }
    public string name { get; set; } = "defaultValue";
}
[Table(Name = "table2")]
class TestFluenttb2
{
    public int Id { get; set; }
    public string name { get; set; } = "defaultValue";
}

fsql 是一个 IFreeSql 对象

FluentApi 方法命名不优雅,主要考虑到和 Attribute 一致,可以减少理解成本。如果你对 EFCore FluentApi 很熟悉可以使用扩展包:

dotnet add package FreeSql.DbContext

fsql.CodeFirst.Entity<Song>(eb =>
{
    eb.ToTable("tb_song");
    eb.Ignore(a => a.Field1);
    eb.Property(a => a.Title).HasColumnType("varchar(50)").IsRequired();
    eb.Property(a => a.Url).HasMaxLength(100);

    eb.Property(a => a.RowVersion).IsRowVersion();
    eb.Property(a => a.CreateTime).HasDefaultValueSql("getdate()");

    eb.HasKey(a => a.Id);
    eb.HasIndex(a => a.Title).IsUnique().HasName("idx_xxx11");

    //一对多、多对一
    eb.HasOne(a => a.Type).HasForeignKey(a => a.TypeId).WithMany(a => a.Songs);

    //多对多
    eb.HasMany(a => a.Tags).WithMany(a => a.Songs, typeof(Song_tag));
});

fsql.CodeFirst.Entity<SongType>(eb =>
{
    eb.HasMany(a => a.Songs).WithOne(a => a.Type).HasForeignKey(a => a.TypeId);

    eb.HasData(new[]
    {
        new SongType 
        {
            Id = 1,
            Name = "流行", 
            Songs = new List<Song>(new[]
            {
                new Song{ Title = "真的爱你" },
                new Song{ Title = "爱你一万年" },
            })
        },
        new SongType
        {
            Id = 2,
            Name = "乡村",
            Songs = new List<Song>(new[]
            {
                new Song{ Title = "乡里乡亲" },
            })
        },
    });
});

public class SongType
{
    public int Id { get; set; }
    public string Name { get; set; }

    public List<Song> Songs { get; set; }
}

public class Song
{
    [Column(IsIdentity = true)]
    public int Id { get; set; }
    public string Title { get; set; }
    public string Url { get; set; }
    public DateTime CreateTime { get; set; }

    public int TypeId { get; set; }
    public SongType Type { get; set; }
    public List<Tag> Tags { get; set; }

    public int Field1 { get; set; }
    public long RowVersion { get; set; }
}
public class Song_tag
{
    public int Song_id { get; set; }
    public Song Song { get; set; }

    public int Tag_id { get; set; }
    public Tag Tag { get; set; }
}

public class Tag
{
    [Column(IsIdentity = true)]
    public int Id { get; set; }
    public string Name { get; set; }

    public List<Song> Songs { get; set; }
}

优先级

FluentApi < 实体特性

系列文章导航

posted @ 2019-09-17 06:20  FreeSql  阅读(9211)  评论(2编辑  收藏  举报