既存の 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 オブジェクトが呼び出されるたびに、データベースの代わりにエンティティをロードするために他のクラスに委譲されるのでしょうか?