Связи сопоставления LINQ to SQL для создания списка сущностей - PullRequest
1 голос
/ 24 февраля 2011

Я читаю Apress Pro ASP.NET MVC Framework , и есть несколько примеров LINQ to SQL, но они не показывают базу данных для этого примера, и не совсем понятно, как это работает, поэтому я надеялся получить разъяснения от сообщества.

Насколько я понимаю, в базе данных Item не может иметь список Bid с, поэтому, если бы мы хотели получить список, мы запросили бы таблицу Bids для всех Bid с соответствующим ItemID. В примере с книгой выглядит, как будто между Item и Bid установлена ​​связь, но я подозреваю, что таблица Items не имеет внешнего ключа, который связывал бы ее с Bid, поэтому я имею несколько вопросов:

  1. На чем основана ассоциация?
  2. Может ли LINQ автоматически определить, в какую таблицу выполнить сопоставление, на основе связанной модели (в данном случае Bid сопоставляется с таблицей Bids)?
  3. Будет ли свойство Bids модели Item автоматически заполняться всеми соответствующими Bid с? Если нет, то как этого достичь?

Вот пример

[Table(Name="Members")] 
public class Member
{
    [Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
    internal int MemberID { get; set; }
    [Column] public string LoginName { get; set; }
    [Column] public int ReputationPoints { get; set; }
}

[Table(Name = "Items")] 
public class Item
{
    [Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
    public int ItemID { get; internal set; }
    [Column] public string Title { get; set; }
    [Column] public string Description { get; set; }
    [Column] public DateTime AuctionEndDate { get; set; }

    [Association(OtherKey = "ItemID")]
    private EntitySet<Bid> _bids = new EntitySet<Bid>();
    public IList<Bid> Bids { get { return _bids.ToList().AsReadOnly(); } }
}

[Table(Name = "Bids")] 
public class Bid
{
    [Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
    internal int BidID { get; set; }
    [Column] internal int ItemID { get; set; }
    [Column] public DateTime DatePlaced { get; internal set; }
    [Column] public decimal BidAmount { get; internal set; }
    [Column] internal int MemberID { get; set; }

    internal EntityRef<Member> _member;
    [Association(ThisKey = "MemberID", Storage = "_member")]
    public Member Member {
        get { return _member.Entity; }
        internal set { _member.Entity = value; MemberID = value.MemberID; }
    }
}

1 Ответ

1 голос
/ 24 февраля 2011

Ваше подозрение на # 2 неверно; LINQ-to-SQL (как и большинство ORM) действительно , фактически знает, какая таблица имеет фактическую связь. Родительско-дочерние отношения могут иметь свойства навигации по обе стороны от ассоциации.

Об этом заботятся автоматически. Что касается заполнения свойства, это произойдет либо при явной загрузке, либо (если включена отложенная загрузка) при доступе к свойству.

...