2009-11-05 4 views
0

데이터베이스에 2 개의 테이블이 있습니다. 수식 및 성분. 그들은 many-to-many 관계를 가지고 있으므로, FormulaIngredient라고 불리는 db 테이블에 연관 테이블을 가지고 있습니다.NHibernate를 사용하여 many-to-many 연관 테이블에 데이터를 삽입하는 방법

저는 C# .net 및 SQL server 2005를 사용하고 있습니다. 내 FormulaIngredient 테이블에 ID, formulaID, ingredientsID, ingredientAmount가 있습니다. 이 extra ingredientsAmount 필드에 대해 C#에서 연관 클래스를 만들었습니다. 이제 데이터베이스에 수식을 저장하겠습니다. 그리고 나서 그 수식의 성분 목록을 FOrmulaIngredient Table에 저장하려고합니다. 어떻게 할 수 있습니까? FormulaIngredient 테이블에 데이터를 저장할 수 없습니다. 내 FormulaIngredient 클래스는

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace NutritionLibrary.Entity 
{ 



    public class FormulaIngredient 
    { 
     private int iD; 

     private Formula objFormula; 
     private Ingredient objIngredient; 
     private float ingredientAmount; 


     public FormulaIngredient() 
     { 

     } 


     public virtual int ID 
     { 
      get { return iD; } 
      set { iD = value; } 
     } 


     public virtual int IngredientID 
     { 
      get { return objIngredient.IngredientID; } 
      set { objIngredient.IngredientID = value; } 
     } 

     public virtual int FormulaID 
     { 
      get { return objFormula.FormulaID; } 
      set { objFormula.FormulaID = value; } 
     } 

     public virtual Ingredient ObjIngredient 
     { 
      get { return objIngredient; } 
      set { objIngredient = value; } 
     } 
    public virtual Formula ObjFormula 
     { 
      get { return objFormula; } 
      set { objFormula = value; } 
     } 
     public virtual float IngredientAmount 
     { 
      get { return ingredientAmount; } 
      set { ingredientAmount = value; } 
     } 
    } 
} 

여기 FormulaIngredient에 대한 매핑 파일입니다 :

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="NutritionLibrary.Entity.FormulaIngredient, NutritionLibrary" table="NutrientIngredient" lazy="false"> 
    <id name="ID" column="ID" > 
     <generator class="native" /> 
    </id> 

    <many-to-one name="ObjIngredient" column="ingredientID" class="NutritionLibrary.Entity.Ingredient, NutritionLibrary" not-null="true" /> 
    <many-to-one name="ObjFormula" column="formulaID" class="NutritionLibrary.Entity.Formula, NutritionLibrary" not-null="true" /> 

    <property name="IngredientAmount" column="ingredientAmount" type="float" not-null="true" /> 


    </class> 
</hibernate-mapping> 

도와주세요 !!!!

+0

게시 할 때 코드가 4 자리만큼 들여 쓰기되어 코드로 올바르게 선택되도록하십시오. –

답변

0

자체 테이블로 조인 테이블을 매핑 할 필요가 없습니다. 또한 다른 클래스의 속성에서 Formula.ID를 노출하지 않아야합니다.

<class name="App.Core.Domain.Ingredient, App.Core" table="ingredients"> 
    <set name="Formulas" table="formulaingredientjoin" inverse="false" cascade="all"> 
     <key column="ingredientid"/> 
     <many-to-many class="App.Core.Domain.Forumula, App.Core" column="formulaid"/> 
    </set> 
</class> 


<class name="App.Core.Domain.Formula, App.Core" table="formulas"> 
    <set name="Ingredients" table="formulaingredientjoin" inverse="false" cascade="all"> 
     <key column="formulaid"/> 
     <many-to-many class="App.Core.Domain.Ingredient, App.Core" column="ingredientid"/> 
    </set> 
</class> 

이 같은 컬렉션에 추가합니다 :

Formula formula = new Formula(); 
formula.Ingredients.Add(ingredient1) 
formula.Ingredients.Add(ingredient2) 
formula.Ingredients.Add(ingredient3) 
session.Save(formula); 
session.Flush(); 

Ingredient ingredient = new Ingredient(); 
ingredeient.Formulas.Add(formula1); 
ingredeient.Formulas.Add(formula2); 
session.Save(ingredient); 
session.Flush(); 

당신이 필요하지 않은 다음은

3 데이터베이스 테이블 여기

Ingredients: PK:ID(Identity(1,1), Name, Description 
Formula: PK:ID(Identity(1,1), Name, Description 
IngredientFormulaJoin: FK:IngredientID, FK:FormulaID 

create table dbo.Ingredients(id int primary key identity(1,1), Name varchar(100)) 
create table dbo.formulas(id int primary key identity(1,1), Name varchar(100)) 
create table dbo.ingredientformulajoin(ingredientid int foreign key references dbo.ingredients(id), formulaid int foreign key refernces dbo.formula(id)) 

public class Forumula() { 
    public Formula(){ 
    Ingredients = new List<Ingredient>(); 
} 
    public int PK:ID(Identity(1,1) { get; set; } 
    public IList<Ingredient> Ingredients{ get; set; } 
} 

public class Ingredient() { 
public Ingredient(){ 
    Formulas = new List<Formula> 
} 


    public int ID { get; set; } 
    public IList<Forumula> Formulas { get; set; } 
} 

필요한 매핑입니다 조인 테이블을 자체 클래스로 맵핑하십시오. 또한 클래스가 자신의 유형을 캡슐화하도록 허용합니다. 수식 ID를 반환해야하는 유일한 방법은 수식입니다. 예를 들어 재료에 FormulaID를 넣지 않고 formula.ID를 호출합니다.

+1

FormulaIngredientJoin 테이블에 추가 필드가 있으면 어떻게됩니까? FormulaIngredientJoin 테이블에 IngredientAmount라는 필드가 있습니다. 그래서 조인 테이블을 자체 클래스로 매핑해야했습니다. 언급 한대로 저장 부분을 구현하려고합니다. 내가 성공하면 너에게 알려 줄 것이다. – user203212

1

외부 키 (IngredientAmount 열과 같이) 외의 다른 열을 얻는 순간에는 항상 조화 테이블을 매핑해야합니다. 여분의 열에 데이터를 저장하기 위해서뿐만 아니라 데이터를 검색 할 수 있도록 연관 열을 매핑해야합니다. 연관 테이블을 매핑되지 않은 상태로두면 데이터베이스에서 추가 데이터 (IngredientAmount 열)를 쉽게 읽을 수 없습니다.

연관 테이블을 매핑해도 관계형 테이블 (FormulaIngredient)에 대한 수식에서 일대 다 속성을 만들어야한다는 것을 의미하므로 포함 시킬지 여부도 선택할 수 있습니다.) many-to-many 특성을 Ingredients 테이블에 추가하십시오.

<bag name="FormulaIngredients" lazy="true" inverse="true" cascade="all-delete-orphan"> 
    <key column="FormulaID" /> 
    <one-to-many class="FormulaIngredient" /> 
</bag> 

<bag name="Ingredients" table="FormulaIngredient" lazy="true" cascade="all"> 
    <key column="FormulaID" /> 
    <many-to-many column="IngredientID" class="Ingredient" /> 
</bag> 

데이터 저장은 계단식 또는 수동으로 수행 할 수 있습니다 (다시 선택 사항).

Ingredients 속성을 사용하여 계단식을 사용하여 Ingredient 개체를 저장하면 연결 테이블 (FormulaIngredient)의 IngredientAmount 열에 데이터를 저장할 수 없습니다.

연관 테이블에 저장하는 방법은 먼저 수식 개체를 저장 한 다음 필요에 따라 많은 수의 구성 요소 개체를 저장 한 다음 저장된 수식 및 구성 요소 ID를 사용하여 채운 FormulaIngredient 개체를 저장할 수 있습니다 또한 해당 IngredientAmount 속성/열.

대체 메커니즘이있는 경우 관련 메커니즘에 속한 데이터를 저장 및 검색하기 위해 복잡한 메커니즘 (Listeners, 수동 SQL 삽입 문 등)이 필요하며 관련 주요 엔터티가 아닌 것 중 하나의 일부로 가져올 수 있다고 생각합니다. 주요 주체 (수식 또는 성분).

관련 문제