![](/img/trans.png)
[英]How can I resolve a “Do not call overridable methods in constructors” warning for virtual Entity Framework objects?
[英]How do I associate custom made virtual objects to link to relational objects working like Entity Framework?
我有一個CustomerDetails
和一個CustomerAddress
對象。 構造函數如下:
public class CustomerDetails
{
[Key]
public int CustomerID { get; set; }
[Required]
[StringLength(50)]
public string CustomerName { get; set; }
public int AddressID { get; set; }
public virtual CustomerAddress customerAddress { get; set; }
}
public class CustomerAddress
{
[Key]
public int AddressID { get; set; }
[Required]
[StringLength(200)]
public string Address { get; set; }
public virtual ICollection<CustomerDetails> CustomerDetails { get; set; }
}
我已經從生成的 Entity Framework 代碼中復制了這兩個構造函數。
我使用SqlDataReader
填充客戶列表和地址列表
List<CustomerDetails> customers = new List<CustomerDetails>();
List<CustomerAddress> addresses = new List<CustomerAddress>();
SqlCommand cmd = new SqlCommand("select * from Customerdetails", con);
using (IDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
CustomerDetails customer = new CustomerDetails
{
CustomerID = Convert.ToInt32(rdr["CustomerID"]),
AddressID = Convert.ToInt32(rdr["AddressID"]),
CustomerName = rdr["CustomerName"].ToString()
};
customers.Add(customer);
}
}
cmd = new SqlCommand("select * from CustomerAddress", con);
using (IDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
CustomerAddress address = new CustomerAddress
{
AddressID = Convert.ToInt32(rdr["AddressID"]),
Address = rdr["Address"].ToString()
};
addresses.Add(address);
}
}
當我嘗試使用 LINQ 綁定數據以顯示客戶地址時,它無法按預期工作。
GridView1.DataSource = from c in customers
select new { c.CustomerName, c.customerAddress.AddressID};
GridView1.DataBind();
我收到一個錯誤:
你調用的對象是空的
我知道這會發生。 但是讓虛擬對象鏈接到關系對象以使引用起作用的技巧是什么?
我認為您可能需要自己填充虛擬屬性,或者只是刪除它們並在查詢中使用內部聯接。
// populate
For Each CustomerDetail from db
IF CustomerDetail.AddressId NOT IN addresses
Fetch CustomerAddress from Db
addresses.Add(CustomerAddress )
ELSE
FETCH CustomerAddress from addresses
END
CustomerDetail.customerAddress = CustomerAddress
CustomerAddress.CustomerDetails.Add(CustomerDetail)
customers.Add(CustomerDetail)
//inner join
from c in customers
join a in addresses on c.AddressID equals a.AddressID
select new { c.CustomerName, a.Address}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.