EFCore μž‘λ™ 질문...

μ•ˆλ…•ν•˜μ„Έμš”
EFCore μ΄μš©ν•œ κ°œλ°œμ€‘ μ˜λ¬Έμ μ΄μƒκ²ΌλŠ”λ° μ†μ‹œμ›ν•˜κ²Œ 해닡을 λͺ»μ°Ύμ•„μ„œ μ§ˆλ¬Έλ“œλ¦½λ‹ˆλ‹€β€¦

public class DBDelegater
{
	private readonly ControleServerBase.DB.DbContextFactory<ControlContext> _contextFactory;
	ControleServerBase.DB.Context.ControlContext Context { get; set; }
	string[] blank = { "" };

	public DBDelegater()
	{
		_contextFactory = new();
		Context = _contextFactory.CreateDbContext(blank);
	}

	public async Task<DBModels.MobileSet> GetPosition(StatusData dtoContent)
	{
		~~~
		await Context.Positions.AddAsync(mobileSet.daoPosition);
		await Context.SaveChangesAsync();

		mobileSet.daoVacuum.positionId = mobileSet.daoPosition.id;

		await Context.Vacuums.AddAsync(mobileSet.daoVacuum);
		await Context.SaveChangesAsync();
		~~~
	}

	public async Task<DBModels.MobileSet> GetPosition2(StatusData dtoContent)
	{
		~~~
		await Context.Positions2.AddAsync(mobileSet.daoPosition);
		await Context.SaveChangesAsync();

		mobileSet.daoVacuum.positionId = mobileSet.daoPosition.id;

		await Context.Vacuums2.AddAsync(mobileSet.daoVacuum);
		await Context.SaveChangesAsync();
		~~~

	}
}

μœ„μ™€κ°™μ΄ DBDelegaterλΌλŠ”λ†ˆ μ•ˆμ—μ„œ λͺ¨λ“  DBμž‘μ—…μ„ μ§„ν–‰ν•˜κ²Œ ν•˜κ³ 
λ‹€ λΉ„λ™κΈ°μ‹μœΌλ‘œ μž‘μ—…μ΄ λŒμ•„κ°€κ³ μžˆλŠ”μƒνƒœμž…λ‹ˆλ‹€

μ§ˆλ¬Έμ€ μ•„λž˜μ™€κ°™μŠ΅λ‹ˆλ‹€

  1. GetPosition ν•¨μˆ˜μ˜ λ‚΄μš©μ²˜λŸΌ Positions ν…Œμ΄λΈ”μ— 데이터λ₯Ό λ„£κ³  autoincrement 둜 μžλ™μƒμ„±λœ idλ₯Ό Vacuums 데이터에 μž…λ ₯ν›„ ν…Œμ΄λΈ”μ— μ§‘μ–΄λ„£λŠ” 둜직이 μžˆλŠ”λ°
    이경우 SaveChangesλ₯Ό λ‘λ²ˆμ§„ν–‰ν•˜κ²Œλ˜λŠ”λ° 이λ₯Ό κ°„μ†Œν™”λŠ” 방법이 μžˆμ„κΉŒμš”???

  2. Contextλ₯Ό ν•˜λ‚˜ μƒμ„±ν•œλ’€ 이λ₯Ό λŒλ €μ“°κ³ μžˆλŠ”λ° λ§Œμ•½ λΉ„λ™κΈ°λ‘œ μ—¬λŸ¬κ°œ ν•¨μˆ˜κ°€ λŒμ•„κ°€κ³  μžˆλŠ”μƒνƒœμ—μ„œ ν•˜λ‚˜κ°€ AddAsync둜 데이터λ₯Ό μž…λ ₯해두고 SaveChages둜 ν…Œμ΄λΈ”μ— λ°˜μ˜λ˜λŠ” 사이에
    λ‹€λ₯Έ ν•¨μˆ˜μ—μ„œ Context.ChangeTracker.Clear(); μž‘μ—…μ„ν•΄μ„œ νŠΈλž˜μ»€κ°€ μ΄ˆκΈ°ν™”λœκ²½μš°κ°€ λ°œμƒν• μˆ˜μžˆλ‚˜μš”??
    일단 jmeter μ΄μš©ν•΄μ„œ μΌλΆ€λ‘œ λ°œμƒμ‹œμΌœλ³΄λ €κ³ ν–ˆμ„λ• ν•΄λ‹Ή μ—λŸ¬κ°€ λ°œμƒμ€ μ•ˆλ˜μ—ˆλŠ”λ° μ†μ‹œμ›ν•˜κ²Œ 이해가 λ˜μ§€μ•Šμ•„μ„œ μ§ˆλ¬Έλ“œλ¦½λ‹ˆλ‹€

κ°μ‚¬ν•©λ‹ˆλ‹€β€¦

1개의 μ’‹μ•„μš”
  1. 두 EF ν…Œμ΄λΈ” κ°œμ²΄κ°€ FK둜 μΈμŠ€ν„΄μŠ€ μ°Έμ‘°κ°€ λ˜μ–΄μžˆλ‹€λ©΄ Add ν•  λ•Œ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€μ™€ κ΄€κ³„λœ μΈμŠ€ν„΄μŠ€(λͺ©λ‘)이 같이 μ €μž₯λ©λ‹ˆλ‹€. 이 λ•Œ ν‚€λŠ” μžλ™μœΌλ‘œ μž…λ ₯λ©λ‹ˆλ‹€.

  2. μ»¨ν…μŠ€νŠΈλ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œμ™€ κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•˜λ©΄ μ•ˆλ©λ‹ˆλ‹€. μΆ”μΈ‘ ν•˜μ‹œλŠ” 것 처럼 νŠΈλ ˆν‚Ήμ— λ¬Έμ œκ°€ μƒκΉλ‹ˆλ‹€.

4개의 μ’‹μ•„μš”

κ°μ‚¬ν•©λ‹ˆλ‹€!!!

1개의 μ’‹μ•„μš”
  1. 두 μ—”ν‹°ν‹° κ°„ FK관계가 λ§Ίμ–΄μ Έ μžˆμ§€ μ•Šλ‹€λ©΄ μœ„μ˜ μ†ŒμŠ€μ½”λ“œμ²˜λŸΌ 2λ²ˆμ„ ν•΄μ•Όν•˜λŠ”κ²Œ λ§žμŠ΅λ‹ˆλ‹€.
    λ‹€λ§Œ μ €λ ‡κ²Œ μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” κ²½μš°μ—λŠ” 보톡 λͺ…μ‹œμ μœΌλ‘œ νŠΈλžœμ μ…˜μ„ 생성(BeginTransasction)ν•˜μ—¬
    처리 ν›„ 성곡결과에 따라 Commit / Rollback을 ν•΄μ£ΌλŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€.

  2. λΉ„λ™κΈ°λ‘œ μ—¬λŸ¬ 개의 ν•¨μˆ˜κ°€ λ™μ‹œμ— λŒμ•„μ•Ό ν•œλ‹€λ©΄ 각 ν•¨μˆ˜(μŠ€λ ˆλ“œ λ‹¨μœ„)λ³„λ‘œ DbContextλ₯Ό λ”°λ‘œ μƒμ„±ν•˜λ„λ‘ ν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ”κ²Œ μ’‹μŠ΅λ‹ˆλ‹€. λ‹€λ§Œ μœ„μ˜ μ†ŒμŠ€μ½”λ“œλ§Œμ„ λŒ€μƒμœΌλ‘œ ν…ŒμŠ€νŠΈλ₯Ό ν•˜μ…¨λ‹€λ©΄ 각 비동기 λ©”μ†Œλ“œ λ§ˆλ‹€ await μ²˜λ¦¬κ°€ λ˜μ–΄μžˆμœΌλ―€λ‘œ 각 비동기 λ©”μ†Œλ“œ 간에 λ™μ‹œμ— DbContextλ₯Ό μ°Έμ‘°ν•  일은 μ—†μ–΄ 보이긴 ν•©λ‹ˆλ‹€.

4개의 μ’‹μ•„μš”

ν˜Ήμ‹œ DbContextλ₯Ό μž¬μ‚¬μš©ν•˜μ‹œλŠ” μ΄μœ κ°€ μžˆμœΌμ‹ κ°€μš”?
일반적으둜 DbContextλŠ” λ…Όλ¦¬μ μœΌλ‘œ κ°€λ²Όμš΄ 객체둜 λ§€ μ˜€νΌλ ˆμ΄μ…˜ μ‹œ λ…λ¦½μ μœΌλ‘œ μƒμ„±ν•΄μ„œ μ‚¬μš©ν•΄λ„ λ¬Έμ œκ°€ μ—†λŠ” κ²ƒμœΌλ‘œ μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.

그리고 λ§€ λ‹¨μœ„ μ‹€ν–‰λ§ˆλ‹€ await ν•˜μ§€ μ•Šκ³  Task μ•ˆμ—μ„œ λ‹¨μœ„ 싀행을 동기 μ²˜λ¦¬ν•˜λŠ”κ²Œ μ–΄λ–¨κΉŒ μ‹Άλ„€μš”.

public async Task<DBModels.MobileSet> GetPosition(StatusData dtoContent)
{
     return await Task.Run(() =>
     {
         using(var context = _contextFactory.Create()) // returns a DataContext.
         {
             // do stuff.
         }
     });
}
4개의 μ’‹μ•„μš”