EF core的使用

版权声明:.net/web/医疗技术的木子纵横的个人分享 https://blog.csdn.net/muzizongheng/article/details/85164774

EF core相比EF6 , 对于DDD的支持更好。 比如私有字段的映射, 私有数组多对多的映射等等。

EF core 有几个坑需要注意:

1.多对多的关系,因为只支持HasOne和Withmany, 不支持HasMany。 因此必须手动建立多对多的关系表的entity定义类, sample code如下:

class MyContext : DbContext

{

    public DbSet<Post> Posts { get; set; }

    public DbSet<Tag> Tags { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)

    {

       //start{把多对多关系表用fluent api实现关联

        modelBuilder.Entity<PostTag>()

            .HasKey(t => new { t.PostId, t.TagId });

        modelBuilder.Entity<PostTag>()

            .HasOne(pt => pt.Post)

            .WithMany(p => p.PostTags)

            .HasForeignKey(pt => pt.PostId);

        modelBuilder.Entity<PostTag>()

            .HasOne(pt => pt.Tag)

            .WithMany(t => t.PostTags)

            .HasForeignKey(pt => pt.TagId);

      //}end

    }

}

public class Post

{

    public int PostId { get; set; }

    public string Title { get; set; }

    public string Content { get; set; }

    public List<PostTag> PostTags { get; set; }

}

public class Tag

{

    public string TagId { get; set; }

    public List<PostTag> PostTags { get; set; }

}

public class PostTag //多对多的关系表

{

    public int PostId { get; set; }

    public Post Post { get; set; }

    public string TagId { get; set; }

    public Tag Tag { get; set; }

}

  1. 私有属性的映射支持。 注意默认保证公开 和私有的命名大小写完全一致(除了首字母) , 当然你可以通过hasField来指定不同的命名规则的field。 sample code 如下

class MyContext : DbContext

{

    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)

    {

  modelBuilder.Entity<Blog>()

    .Property(b => b.Url)

    .HasField("_validatedUrl")

    .UsePropertyAccessMode(PropertyAccessMode.Field);

    }

}

public class Blog

{

    private string _validatedUrl;

    public int BlogId { get; set; }

    public string Url

    {

        get { return _validatedUrl; }

    }

    public void SetUrl(string url)

    {

        using (var client = new HttpClient())

        {

            var response = client.GetAsync(url).Result;

            response.EnsureSuccessStatusCode();

        }

        _validatedUrl = url;

    }

}

3.EF core读取connection string 是从appsetting.json中获取的。

4.EF core支持内存模式, 即对DbContext的操作存入内存中,而不是持久化到数据库文件中

猜你喜欢

转载自blog.csdn.net/muzizongheng/article/details/85164774