0

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: タイプ 'Int32' のキー 'Id' のキー メンバー 'Id' が見つかりませんでした。キーが間違っているか、「Int32」のフィールドまたはプロパティの名前が変更されている可能性があります..

したがって、Linq 2 SQL に Id が Int32 ではなく GUID であることを伝える方法を理解する必要があります...そこで、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; }
    }
}
4

1 に答える 1

1

問題はここにあると思います:

Member="AchievementTypeId"

関連付けの場合、型指定されたメンバーをリンクする必要があります。たとえば、「AchievementType」(AchievementType 型) というプロパティがあり、Member="AchievementType" があるとします。

たとえば、Northwind で Customer と Order をリンクすると (Order の場合)、次のように表示されます。

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

SqlMetal で生成されたコードには、CustomerID プロパティと Customer プロパティをリンクする非常に複雑なコードが含まれています。

于 2008-09-29T19:04:24.307 に答える