我创建了一个简单的类和基于此类的列表。当我尝试populte这个列表并发送到视图iam得到一个错误。请根据数据库查看我的类和自定义映射器模型。
Folloiwng是班级。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MvcModal.Models
{
public class mytransaction
{
public int Id { get; set; }
public int my_trn_id { get; set; }
public string Description { get; set; }
public List<mytransaction> Translist { get; set; }
}
}
以下是自定义数据库映射器类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using MvcModal.Models;
namespace MvcModal.Models
{
public class PrContext : DbContext
{
static string _conString = @"Data Source=.\sqlexpress;Initial Catalog=MyDb;Integrated Security=True";
public PrContext() : base(_conString) { }
public DbSet<mytransaction> MyTransactions { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<PrContext>(null);
modelBuilder.Configurations.Add(new NewTransactMapper());
}
public class NewTransactMapper : EntityTypeConfiguration<mytransaction>
{
public NewTransactMapper()
{
this.ToTable("mytransaction");
this.Property(m => m.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.HasKey(m => m.my_trn_id);
}
}
}
}
以下是错误图片。
请查看红色圆圈错误并查看 mytransactions_my_trn_id 文字。 mytransaction 是我的表名, my_trn_id 是我的列名。其余的栏目没有问题,但这让我很疯狂。
请任何人指导我丢失的内容,以及如何使我的表名和列隔离并解决此错误。提前谢谢。
答案 0 :(得分:0)
如果您想要创建模型,您必须知道EF生成的列以处理关系,如果您没有指定名称(如本例所示),您必须知道EF将分配给属性的名称。
我建议你(我这样做)使用EF标准迁移在空数据库上生成模型,然后从EF创建的数据库中复制结构。
在您的情况下,您只需要添加类型为int的mytransaction_my_trn_id列(与id相同)。如果您需要EF将通过迁移生成相同的数据库,您还需要在该列上添加索引以及从该列到my_trn_id列(主键)的关系。
答案 1 :(得分:0)
我使用以下代码完成了它。它也可能对某人有所帮助。还要感谢大家提出的好建议。
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;
using System.Data.Entity.ModelConfiguration.Configuration;
using payorder_draft_printing.Controllers;
namespace payorder_draft_printing.Models
{
public class context_db : DbContext
{
static string _conString = @"Data Source=my datasource";
public context_db()
: base(_conString)
{
Database.SetInitializer<context_db>(null);
}
public IDbSet<sms_description> sms_description { get; set; }
public IDbSet<sms_imported_trn_code> sms_imported_trn_code { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new sms_description_mapper());
modelBuilder.Configurations.Add(new sms_imported_trn_code_mapper());
}
}
class sms_description_mapper : EntityTypeConfiguration<sms_description>
{
public sms_description_mapper()
{
ToTable("dbo.sms_description");
this.Property(x => x.id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasKey(x => x.trn_code);
Property(x => x.trn_code).HasColumnName("trn_code").IsRequired();
}
}
class sms_imported_trn_code_mapper : EntityTypeConfiguration<sms_imported_trn_code>
{
public sms_imported_trn_code_mapper()
{
ToTable("dbo.sms_imported_trn_code");
HasKey(x => x.trn_code);
this.Property(x => x.id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(x => x.trn_code).HasColumnName("trn_code").IsRequired();
}
}
}