2

私はここで多くの質問を検索しましたが、それは私のものと似ていましたが、私の問題に一致するものはありませんでした.

私は EF Code First を使用し、それを既存の (レガシー) MySQL データベースにマップしようとしています。1 つを除いて私のプロパティで正常に動作しますが、その理由がわかりません..

null のモデル:

[Table("einheitenstamm")]
public class Unit : ClassicEntity
{
    [Key]
    [Column("estID")]
    public int Id { get; set; }

    [Column("estEinheit")]
    public string Name { get; set; }
}

Unit への参照を含むモデル:

[Table("artikeldaten_preise")]
public class ArticlePrice : ClassicEntity
{
    [Key]
    [Column("id")]
    public int Id { get; set; }

    [Column("einheit")]
    [ForeignKey("Id")]
    public virtual Unit Unit { get; set; } /* is always null!!!!! */

    [Column("preisliste")]
    [ForeignKey("Id")]
    public virtual Pricelist Pricelist { get; set; } /* gets loaded without problems */

    [Column("artikel")]
    [ForeignKey("Id")]
    public virtual Article Article { get; set; } /* gets loaded without problems */


    [Column("preis")]
    public double Price { get; set; }
}

データベース テーブルの作成:

CREATE TABLE `artikeldaten_preise` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `preisliste` INT(11) NOT NULL,
    `artikel` VARCHAR(10) NOT NULL,
    `preis` DECIMAL(10,2) NOT NULL,
    `einheit` INT(11) NOT NULL,
    `changed` DATETIME NULL DEFAULT NULL,
    `sys_deleted` BIT(1) NOT NULL DEFAULT b'0',
    `sys_changedfrom` VARCHAR(50) NULL DEFAULT NULL,
    `sys_changedat` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    INDEX `artikel` (`artikel`) USING BTREE,
    INDEX `preisliste` (`preisliste`) USING BTREE,
    INDEX `einheit` (`einheit`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2;

コード:

var units = from unit in context.Units
            where unit.Id == 4
            select unit;

foreach (var unit in units)
    Console.WriteLine(unit.Id + ": " + unit.Name); /* works */


var prices = from price in context.ArticlePrices
             select price;

foreach (var price in prices.ToList()) /* price.Unit = NULL ........... */
    MessageBox.Show(price.Article.Description + " " + price.Price + "/"
                    + price.Unit.Name + " in pricelist '"
                    + price.Pricelist.Name + "'");

誰が私が間違っているのか教えてもらえますか?

4

2 に答える 2

1

リレーションを明示的に定義し、ナビゲーション プロパティごとに xxId プロパティを作成する必要があります。これを、対応する ForeignKey 属性で装飾できます。ここでは「本当の」外部キーは必要ありません..

[Table("artikeldaten_preise")]
public class ArticlePrice : ClassicEntity
{
    [Key]
    [Column("id")]
    public int Id { get; set; }

    [Column("einheit")]
    public int UnitId { get; set; }

    [ForeignKey("UnitId")]
    public virtual Unit Unit { get; set; }

    [Column("preisliste")]
    public int PricelistId { get; set; }

    [ForeignKey("PricelistId")]
    public virtual Pricelist Pricelist { get; set; }

    [Column("artikel")]
    public int ArticleId { get; set; }

    [ForeignKey("ArticleId")]
    public virtual Article Article { get; set; }

    [Column("preis")]
    public double Price { get; set; }

}
于 2013-06-10T09:07:11.837 に答える
0
  var prices = from price in context.ArticlePrices.Include("Price.Unit")
                     select price;
于 2013-06-07T13:51:42.290 に答える