English 中文(简体)
Table per hierarchy inheritance with POCO entities in Entity Framework 4
原标题:

Our organization is looking to standardize on Entity Framework once v4 comes out. As a result, I am looking at what it would take to migrate our application that uses NHibernate for persistence to EF4 using POCO support. In a couple of places we use single table inheritance (also known as Table Per Hierarchy). I have been unable to get it to work using the following.

Payment (base class [should be abstract but having trouble there as well]) CreditCardPayment (concrete implementation) ACHPayment (concrete implementation) CheckPayment (concrete implementation)

Right now, I am mapping them with only the base class properties. All of these classes are in the same namespace. They have a discrimimator that is called PaymentTypeId in the database, so the Payment mapping has a condition of "When PaymentTypeId = 0". Each of the subclasses have the same condition with different values (i.e. CreditCardPayment = 1, etc.).

When I try to load each a list of all payments using DataContext.Payments.ToList() (DataContext inherits from ObjectContext) I am getting the following exception:

"Object mapping could not be found for Type with identity DataLayer.DataModel.CreditCardPayment ."

I can t figure out what this means, as the POCO CreditCardPayment class lives in the same namespace as the POCO Payment class does (in fact in the same file).

What am I missing?

最佳回答

What I didn t represent before (I didn t think it relevant, but it was). Was that CreditCardPayment inherited from an intermediary class named "CreditPayment" and ACHPayment inherited from CashPayment. CreditCardPayment and CashPayment live in the same namespace and file, but were not represented in the EF mapping. Once I added those within the mapping file, everything worked ok.

So, even thought EF does not ever map to one of those types directly, it seems to need to know about them, because it changes the basetype of the CreditCardPayment classes et al. Thank you for your help on this.

问题回答

This is complaining not about database mapping, but model to CLR mapping.

The EF can t for some reason find your CreditCardPayment class.

Now one possible reason is that you haven t loaded the metadata for it yet.

For example if you have this:

Assembly 1:
 - Payment

Assembly 2 references Assembly 1:
 - CreditCardPayment extends Payment

Then when you query the EF doesn t know where CreditCardPayment lives.

The way to get around this is with LoadAssembly i.e:

using (DataContext ctx = new DataContext())
{
   ctx.MetadataWorkspace.LoadFromAssembly(typeof(CreditCardPayment).Assembly);

   // now do your query.

}

You need to tell to LoadFromAssembly every assembly that isn t directly reference by your DataContext class.

Note: typeof(Payment).Assembly is directly referenced because of the IQueryable<Payment> Payments property.

Hope this helps

Alex

Microsoft.





相关问题
Entity Framework with MySQL connector in c#

I have been trying to get the Entity Framework to work in my web application using MySQL. It works fine on my local pc, but doesn t work when I put it on the server. Since the server is a shared ...

How Do I Create And Update A Many To Many Relationship With EF

I am using the Entity Framework with SQL Server. I have a many to many relationship between 2 tables. I have created a join table with just the primary key fields of the 2 tables. In the designer, the ...

Entity Framework with File-Based Database

I am in the process of developing a desktop application that needs a database. The application is currently targeted to SQL Express 2005 and works wonderfully. However, I m not crazy about having ...

Linq to enties, insert foreign keys

I am using the ADO entity framework for the first time and am not sure of the best way of inserting db recored that contain foreign keys. this is the code that i am using, I would appreciate any ...

Entity Framework - Many to many question

I have a table called ASB and a table called PeopleInvolved. There is a junction table called PeopleInvolved_ASB which simply contains an ASBID and a PeopleInvolvedID column. The columns act as a ...

Post back complex object from client side

I m using ASP.NET MVC and Entity Framework. I m going to pass a complex entity to the client side and allow the user to modify it, and post it back to the controller. But I don t know how to do that ...

ADO.NET Entity Data Model are not precise enough

I run this code: var cos = from k in _db.klienci_do_trasy where k.klient_id == 5 select k; but the query send to database is: SELECT * FROM `klienci_do_trasy` LIMIT 0, 30 why is it for, there ...

热门标签