2017-10-15 32 views
0

エンティティフレームワークを使用してasp.net mvcを使用してWebサイトを開発しています。私は既存のデータベースを持っており、その関係を以下に示します。親テーブルに外部キーを作成し、asp.netのエンティティフレームワークを使用して子テーブルに割り当てる方法

親テーブル:

public class Accounts 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 

    public int AddressId { get; set; } 

    public virtual Addresses Address { get; set; } 

    //Other properties... 
} 

子テーブル:

public class Addresses 
{ 
    [Key, ForeignKey("Account")] 
    public int AddressId { get; set; } 

    public virtual Accounts Account { get; set; } 

    //Other properties... 
} 

//ユーザー・ロジックを作成します。

public void CreateUser(UserModel model) 
{ 
     Addresses newAddress = new Addresses() 
     { 
      ShippingFirstName = "1", 
      ShippingLastName = "1", 
      ShippingAddress = "1", 
      ShippingAddress2 = "1", 
      ShippingCity = "1", 
      ShippingState = "1", 
      ShippingZip = "1", 
      ShippingCountry = "1", 
      ShippingPhone = "1", 
     }; 

     Accounts newAccount = new Accounts 
     { 
      UserFirstName = "a", 
      UserLastName = "a", 
      UserEmail = model.UserEmail, 
      UserPassword = model.UserPassword, 
      AddressId = 1, 
      UserType = "User", 
      Address = newAddress 
     }; 
     context.Accounts.Add(newAccount); 
     context.SaveChanges(); 
} 

私がでCreateUser機能を使用して新しいユーザーを作成

、あるAddressId (プライマリキー)は、アカウントテーブルのAccountId(プライマリキー、ID列)と同じですエンティティフレームワークが外部キーとしてUserIdを使用し、それをAddressesテーブルに割り当てていることを意味します。しかし、私のデータベースでは、外部キーはAccountsテーブルのAddressIdであり、AddressesテーブルのAddressIdを指しています。

質問:

  1. 私が正しくエンティティクラスに関係を設定していますか?

  2. 外部キーとしてAddressId in Accountsテーブルを使用する必要があるエンティティ・フレームワークに、context.Accounts.Add(newAccount)およびcontext.SaveChanges()の後にAddressesテーブルのAddressIdに割り当てる方法を教えてください。 ?

  3. アカウントテーブルで外部キー(AddressId)を生成する方法を教えてください。

答えて

0

[ForeignKey("Account")]UserIdあるAddressIdテイクAccountsの主キーを、作ります。

public class Addresses 
{ 
    [Key] 
    public int AddressId { get; set; } 

    [ForeignKey("Account")]   // Not necessary 
    public int AccountId { get; set; } // Necessary 

    public virtual Accounts Account { get; set; } 

    // Other properties... 
} 

あなたはエンティティに主キーを設定する必要があります:

スプリット

public void CreateUser(UserModel model) 
{ 
    Addresses newAddress = new Addresses() 
    { 
     ShippingFirstName = "1", 
     ShippingLastName = "1", 
     ShippingAddress = "1", 
     ShippingAddress2 = "1", 
     ShippingCity = "1", 
     ShippingState = "1", 
     ShippingZip = "1", 
     ShippingCountry = "1", 
     ShippingPhone = "1", 
     AddressId = 1 // Set primary key 
    }; 

    // ... 
} 
+0

こんにちは@aaron、アカウントテーブルにすでに主を指す外部キー(あるAddressId)がありますAddressesテーブルのキーを押します。 Addressesテーブルに新しいプロパティ(AccountId)を作成せずに行うことは可能ですか? Accountsテーブルでon deleteカスケードを設定しました。アカウントが削除されると、関連するアドレスも削除されます。 – IYU

+0

'Addresses'に' Account'というナビゲーションプロパティが必要な場合は、別の 'AccountId'が必要です。代わりに、外部キーを必要としない逆プロパティ 'ICollection 'を使用することもできます。 – aaron

+0

AddressesテーブルのAccountナビゲーションプロパティを削除し、AccountsテーブルのAddressIdに[ForeignKey( "Address")]を設定すると、Entity FrameworkはAccountsテーブルのAddressIdをアドレスのAddressIdに自動的に割り当てません表。どうしたの?それは私に例外を与え、AddressesテーブルのAddressIdをnullにすることはできないと言います。 – IYU

関連する問題