无法在 EF Code First 中创建复合主键
Can't make a composed primary key on EF Code First
我正在尝试在 EF 上进行新项目的首次迁移,但我一直收到一个没有意义的异常。
我为我的每个业务 classes 使用单独的配置 classes 并且收到异常的是这个:
public class AlunoAcessaArquivoMapeamento : EntityTypeConfiguration<AlunoAcessaArquivo> {
public AlunoAcessaArquivoMapeamento() {
ToTable(Regex.Replace(typeof(AlunoAcessaArquivo).Name, "([^A-Z])([A-Z])", "_").ToLower());
HasKey(e => new {e.AlunoId, e.ArquivoId});
HasRequired(a => a.Aluno).WithMany(a => a.AlunosAcessaArquivos).HasForeignKey(a => a.AlunoId);
HasRequired(a => a.Arquivo).WithMany(a => a.AlunosAcessaArquivos).HasForeignKey(a => a.ArquivoId);
}
}
它配置的class就是这个,就是一个简单的多对多关系table:
public class AlunoAcessaArquivo : EntidadeBase {
public virtual Aluno Aluno { get; set; }
public virtual Arquivo Arquivo { get; set; }
public long AlunoId;
public long ArquivoId;
}
当我尝试 Add-Migration
时出现异常:
System.InvalidOperationException: The properties expression 'e => new <>f__AnonymousType0`2(AlunoId = e.AlunoId, ArquivoId = e.ArquivoId)' is not valid. The expression should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) t.MyProperty'. When specifying multiple properties use an anonymous type: C#: 't => new { t.MyProperty1, t.MyProperty2 }' VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'.
这个异常没有任何意义。请注意,我在第一个代码示例的第四行配置了我的主键,它显然遵循异常中指定的匿名类型格式,所以我坚持这样做。
您的 AlunoId
和 AlunoAcessaArquivo
中的 ArquivoId
是字段,不是属性。那就是问题所在。使它们的属性如下:
public class AlunoAcessaArquivo : EntidadeBase {
public virtual Aluno Aluno { get; set; }
public virtual Arquivo Arquivo { get; set; }
public long AlunoId { get; set; } // <-- You missed { get; set; }
public long ArquivoId { get; set; } // <-- You missed { get; set; }
}
我正在尝试在 EF 上进行新项目的首次迁移,但我一直收到一个没有意义的异常。
我为我的每个业务 classes 使用单独的配置 classes 并且收到异常的是这个:
public class AlunoAcessaArquivoMapeamento : EntityTypeConfiguration<AlunoAcessaArquivo> {
public AlunoAcessaArquivoMapeamento() {
ToTable(Regex.Replace(typeof(AlunoAcessaArquivo).Name, "([^A-Z])([A-Z])", "_").ToLower());
HasKey(e => new {e.AlunoId, e.ArquivoId});
HasRequired(a => a.Aluno).WithMany(a => a.AlunosAcessaArquivos).HasForeignKey(a => a.AlunoId);
HasRequired(a => a.Arquivo).WithMany(a => a.AlunosAcessaArquivos).HasForeignKey(a => a.ArquivoId);
}
}
它配置的class就是这个,就是一个简单的多对多关系table:
public class AlunoAcessaArquivo : EntidadeBase {
public virtual Aluno Aluno { get; set; }
public virtual Arquivo Arquivo { get; set; }
public long AlunoId;
public long ArquivoId;
}
当我尝试 Add-Migration
时出现异常:
System.InvalidOperationException: The properties expression 'e => new <>f__AnonymousType0`2(AlunoId = e.AlunoId, ArquivoId = e.ArquivoId)' is not valid. The expression should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) t.MyProperty'. When specifying multiple properties use an anonymous type: C#: 't => new { t.MyProperty1, t.MyProperty2 }' VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'.
这个异常没有任何意义。请注意,我在第一个代码示例的第四行配置了我的主键,它显然遵循异常中指定的匿名类型格式,所以我坚持这样做。
您的 AlunoId
和 AlunoAcessaArquivo
中的 ArquivoId
是字段,不是属性。那就是问题所在。使它们的属性如下:
public class AlunoAcessaArquivo : EntidadeBase {
public virtual Aluno Aluno { get; set; }
public virtual Arquivo Arquivo { get; set; }
public long AlunoId { get; set; } // <-- You missed { get; set; }
public long ArquivoId { get; set; } // <-- You missed { get; set; }
}