3

既存の Entity Framework クラスを変更して、config キーに基づいてデータベースではなく、サービスから読み書きできるようにしようとしています。

数週間、サービスと既存のデータベースの両方にデータを保存し、後でデータの整合性を確認してから、サービスに完全に切り替えたいと考えています。

これは私が念頭に置いているアプローチです:

public class UserDbContext : IdentityDbContext<AspNetUsers>
{
    public DbSet<Address> Addresses { get; set; }
    public DbSet<Person> Persons { get; set; }
}

public class AspNetUsers : IdentityUser
{
    public virtual ICollection<Person> Persons { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
    
    public AspNetUsers()
    {
        Addresses = new List<Address>();
        Persons = new List<Person>();
    }
}

データベースから今日アクセスする方法

class Program
{
    static void Main(string[] args)
    {
       var context = new UserDbContext();
       var address = context.Addresses.FirstOrDefault(x => x.UserId == "user12345"); // Load
       
       var newAddress = new Address("street", "city");
       context.Addresses.Add(newAddress);
       context.SaveChanges();
    }
}

しかし、Address 部分を別のサービスに移動したので、データベースから読み取る代わりに、既存のコードで使用したいと考えています。

class Program
{
    static void Main(string[] args)
    {
       var context = new UserDbContext();
       var address = new AddressProvider().GetAddress("user12345"); // Load
       
       var newAddress = new Address("street", "city");
       new AddressProvider().SaveAddress(newAddress);
       
       // How to delegate the Address from database to service here?
       var user = context.Users.FirstOrDefault(x => x.UserId == "user12345"); 
       user.Addresses.FirstOrDefault();
       user.Addresses.Add(newAddress);
    }
}

public class AddressProvider
{
    public Address GetAddress(string userId, UserDbContext context)
    {
        bool loadFromService = true; // will be from config

        if (loadFromService) 
        {
            return new Address(); // this will be fetch from api via HttpClient
        }

        return context.Addresses.FirstOrDefault(x => x.UserId == userId);
    }
  
    public void SaveAddress(Address address, UserDbContext context)
    {
        bool loadFromService = true; // will be from config

        if (loadFromService)
        {
            SaveAddress(address); // this will be sent to API
            return;
        }

        context.Addresses.Add(newAddress);
        context.SaveChanges();
    }
}

ここでの問題は、この Address が Navigation プロパティを介して読み込まれるときに、サービスを直接使用できないことです。

Entity Framework 機能を使用してこれを委任する方法はありますか? では、Address オブジェクトが呼び出されるたびに、データベースの代わりにエンティティをロードするために他のクラスに委譲されるのでしょうか?

4

1 に答える 1