【发布时间】:2020-07-27 12:36:31
【问题描述】:
我是 EFCore 新手,我不明白是否有必要在 OnModelCreating() 方法中指定所有属性,因为当我不需要时,它不会自动添加它们。
例如,我是否必须在OnModelCreating() 中为我的班级的每个属性添加这一行:
builder.Entity<Entity>().Property(p => p.PropertyName);
似乎只有当我使用以前的方法包含它们时,EFcore 才会在数据库中创建列,我确信它不必是这样,因为我遵循了 Ms Docs 教程并且我不必这样做,但是这次我不行了
这是我的模型
public class Block
{
public int SequenceNumber {get ; private set;}
public virtual BlockHeader Header {get ; private set;}
public List<Transaction> Transactions {get ; private set;}
public Block(List<Transaction> transactions,int sequencenumber, BlockHeader header)
{
Transactions= transactions;
Header=header;
Header.SequenceNumber=sequencenumber;
SequenceNumber=sequencenumber;
}
public Block(){
}
}
public class BlockHeader
{
[MaxLength(256)]
public byte[] Hash {get ;}
[MaxLength(256)]
public byte[] PreviousHash { get;}
public DateTime timestamp { get; }
public int version{ get; }
[MaxLength(256)]
public byte[] MerkleRoot{ get; }
public int SequenceNumber {get ; set;}
//this property is used only to configuire the one to one relationship
public Block block{get;set;}
public BlockHeader (byte[] previoushash,int sequencenumber,List<Transaction> transactions)
{
timestamp = DateTime.Now;
PreviousHash = previoushash;
version = 1;
MerkleRoot = ComputeMerkleRoot(transactions);
Hash = ComputeBlockHash();
}
public BlockHeader(){
}
}
这里是上下文类:
class BlockchainDB : DbContext
{
public BlockchainDB()
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL("server=localhost;database = Blockchain ;user = root ; password = sdeath");
}
protected override void OnModelCreating(ModelBuilder builder){
builder.Entity<Block>().HasKey(block => block.SequenceNumber);
builder.Entity<Block>().HasOne<BlockHeader>(block => block.Header)
.WithOne(header => header.block)
.HasForeignKey<BlockHeader>(header => header.SequenceNumber);
builder.Entity<BlockHeader>().Property(p => p.Hash).HasMaxLength(256);
builder.Entity<BlockHeader>().HasKey(header => header.Hash);
builder.Entity<BlockHeader>().Property(p => p.MerkleRoot);
builder.Entity<BlockHeader>().Property( p => p.PreviousHash);
}
public DbSet<Block> Block {get; set;}
public DbSet<BlockHeader> blockheader {get; set;}
}
我错过了什么吗?
【问题讨论】:
-
试试 { get;放; } 在所有属性上
-
@ErikEJ 如果我不想拥有二传手怎么办?
-
@ezio 问题是实体框架在映射数据库模型时需要它们。
-
@dimitar.d 所以这是一条死胡同!
-
@ezio 为什么没有二传手对你来说那么重要?这些对象只是 EF 为您映射的模型。考虑为您的应用程序创建单独的对象并根据需要对其进行建模。
标签: c# orm entity-framework-core