1

ASP.NetMVC4を使用してEntityFrameworkを使用してコードファーストデータベースを構築しようとしています。

私はMVCとEntityFrameworkを初めて使用し、クラスオブジェクトの設計方法に苦労しています。

次のような、AddressInformationクラスのデータプロパティを持つメンバークラスが必要です:-

 public class Member
    {
        public virtual int MemberID { get; set; }
        public virtual string Forename { get; set; }
        public virtual string Surname { get; set; }
        public virtual int age { get; set; }
        public virtual AddressInformation Address { get; set; }
        public virtual string EmailAddress { get; set; }
        public virtual string HomePhoneNumber { get; set; }
        public virtual string MobileNumber { get; set; }
    }



public class AddressInformation
    {
        public virtual int MemberID { get; set; }
        public virtual string HouseNoName { get; set; }
        public virtual string StreetName { get; set; }
        public virtual string Town { get; set; }
        public virtual string County { get; set; }
        public virtual string PostCode { get; set; }
        public virtual string Country { get; set; }
    }

DbContextから継承する別のクラスもあります:-

public class CentralDataStore :DbContext
    {
        public DbSet<Member> Members { get; set; }
        public DbSet<AddressInformation> AddressInfo { get; set; }
    }

コントローラーを追加すると、AddressInformationを入力する機能が得られず、メンバー情報のみがビューに入力されます。

誰かがこれを攻撃するための最良の方法を提案しますか?私が言うように、私はMVCに不慣れです。

4

3 に答える 3

2

私の知る限り、ビューを生成するための標準テンプレートは、ネストされたオブジェクトの入力フィールドを実装していません。ただし、このリンクのように、MVC アプリケーションの標準テンプレートを拡張するオプションがあります。T4 テンプレートに慣れている場合は、ネストされたクラスの入力フィールドの生成を追加できます。

于 2012-12-20T19:18:38.830 に答える
2

このテンプレートの使用には注意が必要です。stackoverflow が簡単に発生する可能性があります。

特に Entity Framework を使用する場合、お互いを指すナビゲーション プロパティを持つ 2 つのエンティティがある場合

デフォルトのObjectテンプレートは、無限ループを防ぐために特定の深さへの再帰を防ぎます。私はこれが気に入らなかったので、自分で書きました:

/ビュー/共有/object.cshtml

@model object

@using System.Text;
@using System.Data;

@{
  ViewDataDictionary viewData = Html.ViewContext.ViewData;
  TemplateInfo templateInfo = viewData.TemplateInfo;
  ModelMetadata modelMetadata = viewData.ModelMetadata;

  System.Text.StringBuilder builder = new StringBuilder();

  string result;

  // DDB #224751
  if (templateInfo.TemplateDepth > 2) 
  { 
    result = modelMetadata.Model == null ? modelMetadata.NullDisplayText 
                                         : modelMetadata.SimpleDisplayText;
  }

  foreach (ModelMetadata propertyMetadata in modelMetadata.Properties
    .Where(pm => pm.ShowForEdit
           && pm.ModelType != typeof(System.Data.EntityState)
           && !templateInfo.Visited(pm))) 
  {
      builder.Append(Html.Editor(propertyMetadata.PropertyName).ToHtmlString());
  }

  result = builder.ToString();
}

@Html.Raw(result)
于 2012-12-20T19:53:28.047 に答える
2

すべてのプロパティを仮想化する必要はなく、ナビゲーションに使用するプロパティのみを仮想化する必要があります。また、Fluency API を使用して、Member と AddressInformation の間の関係をセットアップする必要があります。また、主キーに Id という名前を付けるか、属性または Fluency API を使用して主キーであることを指定する必要があります。Member を AddressInformation にマッピングするための ID もありません。クラス定義は次のようになります。

public class Member
{
    public int ID { get; set; }
    public string Forename { get; set; }
    public string Surname { get; set; }
    public int age { get; set; }
    public virtual int AddressId { get; set; }
    public virtual AddressInformation Address { get; set; }
    public string EmailAddress { get; set; }
    public string HomePhoneNumber { get; set; }
    public string MobileNumber { get; set; }
}

public class AddressInformation
{
    public int ID { get; set; }
    public string HouseNoName { get; set; }
    public string StreetName { get; set; }
    public string Town { get; set; }
    public string County { get; set; }
    public string PostCode { get; set; }
    public string Country { get; set; }
}

注意: プロパティ AddressId を追加して、AddressInformation オブジェクト/テーブルへのマッピングを提供しました。このように Fluency API でリレーションシップを構成します。

public class MemberConfig : EntityTypeConfiguration<Member>
{
    internal MemberConfig()
    {
        this.HasKey(m => m.ID);
        this.HasRequired(m => m.Address)
            .WithRequiredDependent(a => a.ID)
            .HasForeignKey(m => m.AddressId);

    }
 }

外部キー関係を設定することにより、EF は自動的に AddresssInformation を Member オブジェクトに読み込みます。

于 2012-12-20T21:47:38.380 に答える