Fal*_*con 5 c# entity-framework entity-framework-core asp.net-core
错误信息很明确:
''FromSql' 操作的结果中不存在所需的列 'CustomerId'
但不知何故,我真的没想到有一个 CustomerId?
错误发生在这里:
contacts = db.Contacts.FromSql("SIP_API_MONDIA_Contacts_sel").ToList();
addresses = db.Addresses.FromSql("SIP_API_MONDIA_Address_sel").ToList();
Run Code Online (Sandbox Code Playgroud)
控制器:
public IList<Customer> GetAllCustomers()
{
//Initialize the objects
IList<Customer> customers = null;
IList<Contacts> contacts = null;
IList<Addresses> addresses = null;
//Fetch the data from stored procedures
customers = db.Customers.FromSql("SomeProcName").ToList();
contacts = db.Contacts.FromSql("SomeProcName").ToList();
addresses = db.Addresses.FromSql("SomeProcName").ToList();
//Loop through customers and add the contact and addresses when required
foreach(var item in customers)
{
item.Contacts = contacts.Where(x => x.Customer == item.Id).ToList();
item.Addresses = addresses.Where(x => x.Customer == item.Id).ToList();
}
return customers;
}
Run Code Online (Sandbox Code Playgroud)
该模型:
public class Customer
{
public Guid Id { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public string VatCode { get; set; }
public string ChamberOfCommerceCode { get; set; }
public DateTime Modified { get; set; }
public DateTime Created { get; set; }
public string LanguageCode { get; set; }
public decimal Discount { get; set; }
public string CustomerManager { get; set; }
public Guid PriceList { get; set; }
public Guid PaymentCondition { get; set; }
// public bool VatLiable { get; set; }
public bool IsBlocked { get; set; }
public bool IsProspect { get; set; }
public bool IsSuspect { get; set; }
public string Website { get; set; }
public string DashboardUrl { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public string Fax { get; set; }
// public ICollection<FreeFields> FreeFields { get; set; }
// public Dictionary<string, string> UknownElements { get; set; }
public ICollection<Contacts> Contacts { get; set; }
public ICollection<Addresses> Addresses { get; set; }
}
public class FreeFields
{
public string Key { get; set; }
public string Value { get; set; }
}
public class Contacts
{
public Guid Id { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string Initials { get; set; }
public string Function { get; set; }
public Guid Customer { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public string Mobile { get; set; }
public string LanguageCode { get; set; }
public bool IsMainContact { get; set; }
public string Gender { get; set; }
public string Username { get; set; }
}
public class Addresses
{
public Guid Id { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string AddressLine3 { get; set; }
public string Postcode { get; set; }
public string City { get; set; }
public string Country { get; set; }
public string CountryCode { get; set; }
public string Type { get; set; }
public Guid Customer { get; set; }// This Property should be GUID instead of String..
public bool IsMainAddress { get; set; }
public string Route { get; set; }
public string State { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我不完全确定“CustomerId”的错误意味着什么存储过程返回模型的 100% 准确值。
编辑以添加 sql 结果集 && DbContext 的打印 scrn:
public class IsahContext : DbContext
{
public IsahContext()
{
}
public IsahContext(DbContextOptions<IsahContext> options)
: base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(Setting.ConnectionString);
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
//Entities will come here
public DbSet<Customer> Customers { get; set; }
public DbSet<Addresses> Addresses { get; set; }
public DbSet<Contacts> Contacts { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
CustomerId是由 引入的一对多关系的外键的约定名称
public ICollection<Contacts> Contacts { get; set; }
public ICollection<Addresses> Addresses { get; set; }
Run Code Online (Sandbox Code Playgroud)
类的集合导航属性 Customer。
虽然相关类Contacts和Addresses包含一个 property Guid Customer,但由于其名称,它不被识别为外键,因此它属于无外键属性类别。EF Core 假定有一个名为 的影子属性(和列)CustomerId。影子属性约定解释为:
当发现关系但在依赖实体类中找不到外键属性时,可以按照约定创建影子属性。在这种情况下,将引入影子外键属性。影子外键属性将被命名
<navigation property name><principal key property name>(指向主体实体的依赖实体上的导航用于命名)。如果主键属性名称包含导航属性的名称,则名称将为<principal key property name>。如果依赖实体上没有导航属性,则使用主体类型名称来代替它。
为了将Customer属性映射为 FK,您应该使用foreignkey属性:
您可以使用数据注释来配置应将哪个属性用作给定关系的外键属性。这通常是在未按惯例发现外键属性时完成的。
提示
注释[ForeignKey]可以放置在关系中的任一导航属性上。它不需要继续依赖实体类中的导航属性。
例如(因为您在依赖实体中没有导航属性):
[ForeignKey(nameof(Contacts.Customer))]
public ICollection<Contacts> Contacts { get; set; }
[ForeignKey(nameof(Addresses.Customer))]
public ICollection<Addresses> Addresses { get; set; }
Run Code Online (Sandbox Code Playgroud)
或流畅的API:
modelBuilder.Entity<Customer>()
.HasMany(customer => customer.Contacts)
.WithOne() // no nav property
.HasForeignKey(contact => contact.Customer); // the FK property
modelBuilder.Entity<Customer>()
.HasMany(customer => customer.Addresses)
.WithOne() // no nav property
.HasForeignKey(address => address.Customer); // the FK property
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5554 次 |
| 最近记录: |