์ด๋ฒ์ .net8๊ณผ ef8์ ๊ณต๋ถํ๋ ์ค์ ๋์ ํ ์ด์ ๋ฅผ ์ ์ ์๋ ์ค๋ฅ์ ๋ง๋ฅ๋จ๋ฆฌ๊ฒ ๋์ด ์ง๋ฌธํ๊ฒ ๋์์ต๋๋ค.
public class UserAuthorityEntity{
public int Id{get; set;}
public UserAuthority UserAuthority {get; set;}
public int UserId {get; set;}
public virtual UserEntity? UserEntity { get; set; }
}
public enum UserAuthority{
General = 1, //์ผ๋ฐ ์ฌ์ฉ์
Admin = 2, //๊ด๋ฆฌ์
Employee = 3 //์ง์
}
public class UserAuthorityEntityConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.ToTable(โUserAuthorityโ);
builder.HasKey(userAuthority => userAuthority.Id);
builder.Property(userAuthority => userAuthority.UserAuthority)
.IsRequired()
. .HasConversion()
.HasDefaultValue((int)UserAuthority.General);
builder.HasOne(userAuthority => userAuthority.UserEntity)
.WithMany(user => user.UserAuthorities)
.HasForeignKey(userAuthority => userAuthority.UserId)
.OnDelete(DeleteBehavior.Cascade);
}
}
์ด๋ ๊ฒ ๊ตฌ์ฑํ์ฌ ๋ง์ด๊ทธ๋ ์ด์
์ ์งํํ์๋๋ฐ
Unable to create a โDbContextโ of type โโ. The exception โCannot set default value โ1โ of type โSystem.Int32โ on property โUserAuthorityโ of type โwms_api.Models.Enums.UserAuthorityโ in entity type โUserAuthorityEntityโ.โ was
thrown while attempting to create an instance. For the different patterns supported at design time, see ๋์์ธ ํ์ DbContext ๋ง๋ค๊ธฐ - EF Core | Microsoft Learn
ํด๋น ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
HasConversion๋ก intํ์ผ๋ก ๋ณํํด์ ๋ฌธ์ ๊ฐ ์์๊ฑฐ๋ผ ์๊ฐํ๋๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ์ด๊ณณ์ ๊ณณ์์ ๊ฒ์ํด๋ณด์๋ ๋์ ํ ๋ต์ ๋ชจ๋ฅด๊ฒ ์ด์ ์ฌ๊ธฐ์ ์ง๋ฌธ๋๋ฆฌ๊ฒ ๋์์ต๋๋ค.
์ฐ์ , fluent configuration์์, ํ์ ํ๋ผ๋ฏธํฐ๊ฐ ๋น ์ ธ์๋ค์.
public class UserAuthorityEntityConfiguration
: IEntityTypeConfiguration<UserAuthorityEntity>
๋ฌธ์ ๊ฐ ๋๋ ๊ณณ์
public void Configure(EntityTypeBuilder builder)
{
// ...
builder.Property(userAuthority => userAuthority.UserAuthority)
.IsRequired()
.HasConversion() // ์ญ์
.HasDefaultValue((int)UserAuthority.General);
// ...
"์ญ์ "๋ผ๊ณ ํ์๋ ๋ถ๋ถ์ ์ญ์ ํ๊ฑฐ๋, .HasConversion<int>() ์ฒ๋ผ ๋ณํ ํ์์ ์ง์ ํด ๋ณด์ธ์.
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using wms_api.Models.Enums;
public class UserAuthorityEntityConfiguration : IEntityTypeConfiguration<UserAuthorityEntity>
{
public void Configure(EntityTypeBuilder<UserAuthorityEntity> builder)
{
builder.ToTable("UserAuthority");
builder.HasKey(userAuthority => userAuthority.Id);
builder.Property(userAuthority => userAuthority.UserAuthority)
.IsRequired()
.HasConversion<int>()
.HasDefaultValue((int)UserAuthority.General);
// .HasDefaultValueSql("1");
builder.HasOne(userAuthority => userAuthority.UserEntity)
.WithMany(user => user.UserAuthorities)
.HasForeignKey(userAuthority => userAuthority.UserId)
.OnDelete(DeleteBehavior.Cascade);
}
}
์ด๋ ๊ฒ ๊น์ง ํ์์๋๋ฐ ๋๊ฐ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๊ทธ๋ฐ์ง ๋ชจ๋ฅด๊ฒ ๋ค์
์๋์ ๊ฐ์ด ๋ณ๊ฒฝํ๊ฑฐ๋,
.HasDefaultValue(UserAuthority.General);
์ด ๋ถ๋ถ์ ์ญ์ ํ๊ณ
builder.ToTable("UserAuthority");
builder.HasKey(userAuthority => userAuthority.Id);
builder.Property(userAuthority => userAuthority.UserAuthority)
.IsRequired()
.HasConversion<int>()
.HasDefaultValue((int)UserAuthority.General);
// .HasDefaultValueSql("1");
์ํฐํฐ ํด๋์ค๋ฅผ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํ๋ฉด, ์ปจ๋ฒค์
์ด ์์์ ์ฒ๋ฆฌํด์ค๋๋ค.
public class UserAuthorityEntity
{
// ...
public UserAuthority UserAuthority {get; set;} = UserAuthority.General;
// ...
}
๋ชจ๋ธ Configuration ์ ์ปจ๋ฒค์
์ ์์งํ๊ณ ๋์, ์ปจ๋ฒค์
์ ๋ฐ๋ฅด์ง ์๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉํ๋ ๊ฒ ์ข์ต๋๋ค.
builder.ToTable("user_authorities");
builder.Property(userAuthority => userAuthority.UserAuthority)
.HasConversion(
// instance type to DB compatible CLR type
obj => obj.ToString(),
// DB compatible CLR type to instance type
str => Enum.Parse(typeof(UserAuthority), str)
)
;
3๊ฐ์ ์ข์์
UserAuthority enum ๊ด๋ จ Configuration ์๋ฌด๊ฒ๋ ํ์ ์์ต๋๋ค. ์น๋ค ์ง์๋ ๋ฉ๋๋ค.
IsRequired๋ nullable ์ฌ๋ถ๋ฅผ ์ค์ ํ๋ ์ต์
์ด์์.