Entity Framework atypical 1-[0..1] — model-only Association — EF LINQ select possibilities

雨燕双飞 提交于 2019-12-24 08:55:28

问题


Suppose the following tables

 ParentEntities
    ParentID

 ChildEntities
    ChildID
    ParentID

These tables do not have a FK defined in the schema.

In EF designer, after generating from DB, I add an association:
- Parent Multiplicity: 1
- Child Multiplicity: 0 or 1

When I build, I get the error: "Error 3027: No mapping specified for the following EntitySet/AssociationSet - ParentChild"

But if I try to configure table mapping for the association like this..

Maps to ChildEntities 
  Parent
    ParentID <-> ParentID (parent entity prop <-> child table column)

  Child
    ChildID <-> ChildID (child entity prop <-> child table column)

.. I get this: Error 3007: Problem in mapping fragments starting at lines xxx, xxx: Column(s) [ParentID] are being mapped in both fragments to different conceptual side properties.

Why this is an error doesn't make sense. Limitation of the current implementation?


[EDIT 1]
I'm able to make this work by creating a 1-N association. That's not ideal, but it works just the same, just have to add a read-only child property in a partial:

public partial class Parent
{
    public Child Child { get { return Childs.Any() ? null : Childs.First(); } }
}

This seems like the best solution for me. I had to add a FK to the database to get EF to generate the association and navigation property, but once it was added I was able to remove the FK, and further updates to the model from the DB did not remove the association or Navigation properties.


[EDIT 2]
As I was investigating how to work around not caring about the association being modeled in EF, I ran into another issue. Instead of the read-only Child property I made it normal ..

public partial class Parent
{
    public Child Child { get; set; }
}

.. but now I need a way to materialize that from the query:

var query = from parents in context.Parents
            // pointless join given select
            join child in context.Childs 
                on parents.ParentID equals child.ParentID
            select parents;


I can select an anonymous type ..

// step 1
var query = from parents in context.Parents
            join child in context.Childs
                on parents.ParentID equals child.ParentID
            select new { Parent = parents, Child = child };

.. but then I've got to consume more cycles getting that into my entity:

 // step 2
 var results = query.Select(x => {
                   var parent = x.Parent;
                   parent.Child = x.Child; 
                   return parent; });

Is there a better/streamlined way to do this from the query select so the EF materializer can do it from the get-go? If not, then I'll resort to Edit 1 methodology ..


回答1:


Ef Code first requires 1->0..1 relationships for the Child to have the same primary key. Maybe this a similar restriction In the modeler in this circumstance. ParentId (Key) required in Both tables.

I have never tried adding such relationships in designer afterwords in DB first.

EDIT: to match your EDIT2:

I would stay on the direction . Use Navigation properties to get from Join back to original class A and B.

query = context.Set<JoinTable>.Where(Jt=>Jt.NavA.Id == ClassAId
                                  && Jt.navB.Id == ClassBId)

use a select if your need entries returned from either ClassA or ClassB.



来源:https://stackoverflow.com/questions/16287336/entity-framework-atypical-1-0-1-model-only-association-ef-linq-select-p

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!