Как вы определяете тип в сопоставлении SQL Linq 2? - PullRequest
0 голосов
/ 29 сентября 2008

Я пытаюсь сделать свои объекты linq 2 sql вручную, поэтому у меня есть следующий код:

var mapping = XmlMappingSource.FromXml(xml);

using (DataContext ctx = new DataContext(conn_string, mapping))
{
    list = ctx.GetTable<Achievement>().ToList();
}

и XML выглядит так:

<?xml version="1.0" encoding="utf-8" ?>
<Database Name="FatFights" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007">
  <Table Name="dbo.Achievements">
    <Type Name="FatFights.Business.Objects.Achievement">
      <Column Name="Id" Member="Id" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" />
      <Column Name="UserId" Member="UserId" />
      <Column Name="Achieved" Member="Achieved" />
      <Column Name="AchievementId" Member="AchievementTypeId" />
      <Association Name="AchievementType_Achievement" Member="AchievementTypeId" ThisKey="Id" OtherKey="Id" IsForeignKey="true" />
    </Type>
  </Table>
</Database>

возвращает следующую ошибку:

System.InvalidOperationException: Не удалось найти ключевой элемент «Id» ключа «Id» для типа «Int32». Ключ может быть неправильным или поле или свойство в Int32 изменило имена.

Так что мне нужно выяснить, как сказать Linq 2 SQL, что Id - это GUID, а не Int32 ... Поэтому я сгенерировал некоторые Linq2SQL XML, чтобы посмотреть, как они это делают, и они передают Type, но Type не является допустимым. атрибут в соответствии с XSD, поэтому он не работает.

Вот таблица SQL:

CREATE TABLE Achievements
(
    Id              UNIQUEIDENTIFIER    NOT NULL    CONSTRAINT RG_Achievements ROWGUIDCOL
                                                    CONSTRAINT DF_Achievements_Id DEFAULT (NEWID()),
    UserId          UNIQUEIDENTIFIER    NOT NULL,
    AchievementId   INTEGER             NOT NULL,
    Achieved        DATETIME            NOT NULL,

    CONSTRAINT FK_Achievements_Users
        FOREIGN KEY (UserId)
        REFERENCES aspnet_Users (UserId),

    CONSTRAINT FK_Achievements_AcheivementTypes
        FOREIGN KEY (AchievementId)
        REFERENCES AchievementTypes (Id),

    CONSTRAINT PK_Achievements
        PRIMARY KEY (Id),

    CONSTRAINT UQ_Achievements_1
        UNIQUE (UserId, AchievementId)
) 

и бизнес-объект:

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

namespace FatFights.Business.Objects
{
    public class Achievement
    {
        public Guid Id { get; set; }
        public Guid UserId { get; set; }
        public int AchievementTypeId { get; set; }
        public DateTime Achieved { get; set; }
    }
}

1 Ответ

1 голос
/ 29 сентября 2008

Я подозреваю, что проблема здесь:

Член = "AchievementTypeId"

Для ассоциации вы должны связать типизированный член - например, у вас может быть свойство с именем "AchievementType" (типа AchievementType) и иметь Member = "AchievementType".

Например, в Northwind, связывающий шоу клиента и заказа (для заказа):

<Association Name="Customer_Order" Member="Customer"
  ThisKey="CustomerID" OtherKey="CustomerID"
  Type="Customer" IsForeignKey="true" />

Сгенерированный в SqlMetal код имеет слишком сложный код, связывающий свойства CustomerID и Customer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...