2

私はEntityFrameworkCodeFirstApproachを使用しています。PaymentComponentテーブルとPaymentテーブルにデータを挿入するための次のコードがあります。PaymentComponentテーブルに挿入されるデータが適切ではありません。ドメインオブジェクトの対応するプロパティがnullでない場合でも、2つの列(1つのレコード)にNULL値があります。それを機能させるために何を変更する必要がありますか?

ここに画像の説明を入力してください

編集

NerdDinnersクラスに以下を追加すると、次の結果が得られます-新しい不要な列があります

  public DbSet<ClubCardPayment> ClubCardPayments { get; set; }

ここに画像の説明を入力してください

元のコード

static void Main(string[] args)
{
    string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";

    using (var db = new NerdDinners(connectionstring))
    {
        GiftCouponPayment giftCouponPayment = new GiftCouponPayment();
        giftCouponPayment.MyValue=250;
        giftCouponPayment.MyType = "GiftCouponPayment";

        ClubCardPayment clubCardPayment = new ClubCardPayment();
        clubCardPayment.MyValue = 5000;
        clubCardPayment.MyType = "ClubCardPayment";


        List<PaymentComponent> comps = new List<PaymentComponent>();
        comps.Add(giftCouponPayment);
        comps.Add(clubCardPayment);

        var payment = new Payment { PaymentComponents = comps, PayedTime=DateTime.Now };
        db.Payments.Add(payment);

        int recordsAffected = db.SaveChanges();

    }
}

ドメインコード

public abstract class PaymentComponent
{
    public int PaymentComponentID { get; set; }
    public abstract int MyValue { get; set; }
    public abstract string MyType { get; set; }
    public abstract int GetEffectiveValue();
}


public partial class GiftCouponPayment : PaymentComponent
{

    private int couponValue;
    private string myType;

    public override int MyValue
    {
        get
        {
            return this.couponValue;
        }
        set
        {
            this.couponValue = value;
        }
    }

    public override string MyType
    {
        get
        {
            return this.myType;
        }
        set
        {
            this.myType = value;
        }
    }

    public override int GetEffectiveValue()
    {
        if (this.PaymentComponentID < 2000)
        {
            return 0;
        }
        return this.couponValue;
    }

}


public partial class ClubCardPayment : PaymentComponent
{

    private int cardValue;
    private string myType;

    public override int MyValue
    {
        get
        {
            return this.cardValue;
        }
        set
        {
            this.cardValue = value;
        }
    }

    public override string MyType
    {
        get
        {
            return this.myType;
        }
        set
        {
            this.myType = value;
        }
    }

    public override int GetEffectiveValue()
    {
        return this.cardValue;
    }

}

public partial class Payment
{
    public int PaymentID { get; set; }
    public List<PaymentComponent> PaymentComponents { get; set; }
    public DateTime PayedTime { get; set; }

}



//System.Data.Entity.DbContext is from EntityFramework.dll
public class NerdDinners : System.Data.Entity.DbContext
{

    public NerdDinners(string connString): base(connString)
    { 

    }

    protected override void OnModelCreating(DbModelBuilder modelbuilder)
    {
        modelbuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }


    public DbSet<GiftCouponPayment> GiftCouponPayments { get; set; }
    public DbSet<Payment> Payments { get; set; }

}

参照

  1. エンティティフレームワークのコードファーストマッピングプロパティを使用してテーブルを分離する場合、外部キーフィールドを移動します
  2. EntityFrameworkエンティティプロパティをオーバーライドする
  3. EntityFrameworkプロパティをオーバーライドする方法
  4. http://weblogs.asp.net/manavi/archive/2011/04/24/associations-in-ef-4-1-code-first-part-4-table-splitting.aspx
  5. http://www.robbagby.com/entity-framework/entity-framework-modeling-entity-splitting/
  6. エンティティフレームワークマッピングシナリオ-http://msdn.microsoft.com/en-us/library/cc716779.aspx
  7. http://blogs.microsoft.co.il/blogs/gilf/archive/2009/03/06/entity-splitting-in-entity-framework.aspx
4

4 に答える 4

3

datacontextでClubCardPaymentdbsetを定義していません。

これを挿入すると動作するはずです

public DbSet<ClubCardPayment> ClubCardPayments { get; set; }
于 2012-07-24T08:38:13.380 に答える
3

基本クラスに直接実装MyTypeします。MyValueEFでは、共有メンバーを基本クラスにのみ実装できます。派生クラスに実装されたメンバーは、結果のテーブルで独自の列を使用します。

于 2012-07-24T08:41:29.653 に答える
0

抽象クラスの実際の実装である2つのクラスを定義する必要があります。これが、EFがさまざまなクラスと、それらのインスタンスの読み取り/更新/書き込み方法を知る唯一の方法です。

(EFで抽象クラスをマップする必要はありません!)。

于 2012-07-24T08:39:34.850 に答える
0

これはあなたの質問には寄与しませんが、私の側からのヒントにすぎ
ません。派生クラスにMyValueとMyTypeを明示的に実装するのはなぜですか?実装が常に同じである場合は、それを抽象クラスに入れることができます...

于 2012-07-24T08:41:37.963 に答える