我使用MVC模式和Entity Framework 4.1中使用的業務對象。我有三個項目:模型(M),視圖(V)和控制器(C)。實體框架 - MVC - 轉換模式中從數據庫中請求的數據類型(POCO對象)到視圖
M <-------- V --------> C
^ |
|_______________________|
查看項目引用控制器和模式項目。 控制器項目參考模型項目。
與模型之間以及查看還有另外一個項目,假設項目MV,與包含一個接口和一些轉換器(我將在下面解釋)。型號項目引用MV。也查看參考MV。但MV是獨立的,它沒有引用任何項目,既沒有模型也沒有視圖。
在我有我POCO對象(實體)的模型,這些定義物理數據庫設計。 由於我想從視圖中隔離模型,也就是說,我不希望模型依賴於視圖,模型有其自己的實體,視圖也有自己的模型。
例如在瀏覽命名空間我有以下對象:
public class EntityA : InterfaceMV
{
public string Property1 { get; set; }
public int Property2 { get; set; }
EntityB entityB; <--- refrences an entity in the same namespace
}
,並在型號命名空間下面我有對象,其實它包含相同的屬性:
public class EntityA : InterfaceMV
{
public string Property1 { get; set; }
public int Property2 { get; set; }
EntityB entityB; <-- foreign key to an entity in the same namespace
}
我做沒有了在模型中的共享實體和查看,所以我的問題是,從視野中時,我直接訪問該模型使用上下文檢索一些數據,以便從視圖中我做的:
using (DBContext context = new DBContext())
{
Namespace.Model.EntityA a = context.EntitiesA.Find(id);
}
作爲模型和視圖使用不同的實體(儘管它們具有相同的屬性,並且它們,因爲它們是beloging到不同的命名空間視爲不同的對象相同的名稱),我將數據從模型對象轉換,以查看對象。這個轉換是通過使用一個轉換器(接口)完成的,我在上面評論的項目MV中包含的接口(InterfaceMV)中使用了轉換器(接口)。 InterfaceMV如下:
public interface IDataTypeConverterEntityA
{
string Property1 {get; set;}
int Property2 {get; set; }
}
和InterfaceMV由模型中的EntityA和View中的EntityA實現。所以一旦我從模型從視圖中檢索數據:
Namespace.Model.EntityA a = context.EntitiesA.Find(id);
我要的「a」對象(這是類型Namespace.Model.EntityA的)轉換成等值的視圖:
EntityA aConverted = DataTypeConverterEntityA.Convert<Namespace.Model.EntityA, EntityA>(a);
的轉換器是象下面(它是類DataTypeConverterEntityA內):
public static Y Convert<T, Y>(T itemToConvert)
where T : new(), IDataTypeConverterEntityA
where Y : new(), IDataTypeConverterEntityA
{
return new Y
{
property1 = itemToConvert.property1,
property2 = itemToConvert.property2
};
}
Basicaly,我有我的POCO實體代表我的數據庫表,我有一些業務類和我使用C逆變器從一個移動到另一個。
的問題如下: 1。 - 作爲項目MV含有interfaceMV不引用既不模型也不認爲,轉換方法只能轉換標量類型而不是例如其他類型,如在視圖中aConverted所以一旦獲得EntityB屬性轉換後的對象:
// I retrieve the matching entity from the context
EntityA aConverted = DataTypeConverter.Convert<Namespace.Model.EntityA, EntityA>(a);
我要做antoher請求數據庫來獲取EntityB,然後將其轉換並通過這樣做從視圖中EntityA.entityB最後分配:
// I retrieve the matching entity from the context
Namespace.Model.EntityA a = context.EntitiesA.Find(id);
EntityA aConverted = DataTypeConverterEntityA.Convert<Namespace.Model.EntityA, EntityA>(a);
// Inject values into the entity
Namespace.Model.EntityB b = context.EntitiesB.Find(id);
EntityB bConverted = DataTypeConverterEntityB.Convert<Namespace.Model.EntityB, EntityB>(b);
aConverted.entityB = bConverted;
2:正如你所看到的,我必須有一個轉換器因爲從視圖來看,每個實體都不能將從數據庫請求接收到的對象視爲視圖使用自己的權利s .....顯然我必須在每個實體中實現接口,在模型的實體中以及在View的實體中。
這種情況的原因是,我已經完全孤立的示範項目,它是利用自身的entites和視圖還利用自身。
也許保持實體(EntityA,EntityB,....)只在一個地方,Model和View之間共享他們會解決這個問題....使用的數據類型的轉換避免。
所以我的問題是:有沒有更好的方法來避免每次使用數據類型轉換器?或者你認爲這個架構是好的,因爲它將模型從視圖中分離出來?使用這種方法,如果您在View中更改實體,則該模型不受影響,因爲它有自己的實體。我的問題是每次使用數據類型轉換器....
任何想法?